面试中遇到的有关基本知识的问题
1.名字相同的指向不同类型的指针有什么区别
答:计算机的CPU决了内存寻址方式,所以,不管指针所指对象是什么类型的,指针本身的规格都一样。如果一个指针变量的关联类型为int,则通过指针变量访问对象时,读取从指针指示的位置开始的连续4个字节,并按整型数据解释。如果一个指针变量的关联类型为char,则通过指针变量访问对象时,读取指针位置的当前字节,并按字符型数据解释。
2.char * a[]="nieyani"这种写法对不对。
答:这是指针数组。表示数组元素的类型是指针类型。
指针数组说明方式为:类型 * 标识符【表达式】
例如:int * pi[3] //数组元素是关联类型为整形的指针
char * ps[10] //数组元素是关联类型为字符型的指针
3.linux系统vim命令如何让光标移动到最后一行
答:G:光标移到最后一行
nG:光标移到n行首位
n+:光标下移n行
n-:光标上移n行
4.如何申请一段长度为10字节的空间
答:int * p=(int *)malloc (10);
malloc()和new()的区别见转载文章
5.C++中malloc()函数返回的是什么
答:指针
6.static的基本用法
当类成员冠以static声明时,称为静态成员。“静态”是指它的作用域局部于类,一个类可以创建多个对象,因此,静态成员提供了一种同类 对象共享的机制;“成员”是指它与普通类成员一样受不同访问特性的约束。
1.静态数据成员:在类中声明,在类外定义。尽管static数据成员从存储性质上式全局变量,但是其作用域是类。static数据成员在类外可以用“类名::”做限定词,或通过对象访问。
2.静态成员函数:静态成员函数提供了一个不依赖于类数据结构的共同操作,它没有this指针。因为静态成员函数只能访问类的静态数据成员。
7.const基本用法
答:用于约束对象的访问性质,使对象一旦初始化就不允许修改。它的作用分为以下几个方面:
1)标识常量:C++语言中,当用const约束基本类型存储单元为只读事,在程序中使用存储单元的名字就像使用常数值一样,即用表示度表示常量。
const 类型 常量标识符=常量表达式
2)用const约束指针对所指对象访问时,这个指针称为指向常量的指针。
const 类型 *指针 or 类型 const * 指针
3)指针常量:指针变量的值只能在定义的时候初始化,定义后不能修改,即不能改变指针变量的指向。但不影响所指对象的访问特性。 类型 * const 指针
const 写在指针变量名之前,表示约束指针变量本身。
4)指向常量的指针常量:指针本身和所指对象的值在定义后都限制为只读,不能写。
const 类型 * const 指针 or 类型 const * const 指针
5)常引用:冠以const定义的引用,将约束对象用别名方式访问时为只读。 const 类型 & 引用名=对象名
在类中const的用法:
1)常数据成员
2)常对象:若在定义对象的说明语句以const作为前缀,则该对象称为常对象。这个对象的全部数据成员在作用域中约束为只读。
3)常成员函数:常成员函数的this指针被约束为指向常量的指针。由于this指针隐含定义,所以常成员函数在函数头以关键字const做后缀。const成员函数的函数体代码不能修改this所指对象的成员。即以const做后缀的成员函数不能修改类的数据成员也不能调用能够修改数据成员的成员函数。只能调用const成员函数。
4)补充知识:在const成员函数中,用mutable修饰成员变量名后,就可以修改类的成员变量了。
8.C++中如何编写单例类
- class CSingleton
- {
- private:
- CSingleton() //构造函数是私有的
- {
- }
- static CSingleton *m_pInstance;
- public:
- static CSingleton * GetInstance()
- {
- if(m_pInstance == NULL) //判断是否第一次调用
- m_pInstance = new CSingleton();
- return m_pInstance;
- }
- };
- class CSingleton
- {
- private:
- CSingleton() //构造函数是私有的
- {
- }
- static CSingleton *m_pInstance;
- public:
- static CSingleton * GetInstance()
- {
- if(m_pInstance == NULL) //判断是否第一次调用
- m_pInstance = new CSingleton();
- return m_pInstance;
- }
- };
9.指针和引用的区别:
答:引用仅仅是对象(或变量)的别名,不开辟新的内存空间。这与对象(或变量)指针不同。引用常常用于函数的参数传递。另外,引用作为对象(或变量)的别名只能在定义时初始化。
10.迷途指针和空指针
当delete一个指针的时候,实际上仅是让编译器释放内存,但指针本身依然存在。这时它就是一个迷途指针。
当使用以下语句时,就可以把迷途指针改为空指针:MyPtr=0;
11.C++z中有了malloc/free,为什么还需要new/delete?
答:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此,C++语言需要一个能完成动态分配和初始化共走的运算符new,以及一个能够与清理与释放内存工作的运算符delete,new/delete不是库函数,而是运算符。