c++ 常见笔试题
一.const修饰指针
const修饰指针有三种情况:
1.const修饰指针---常量指针
const int * p=&a const使得 *p不能改变
指针的指向可以修改 指针指向的值不可修改
2.const修饰常量---指针常量
int * const p=&a const使得 p不能改变
指针的指向不可以修改 指针指向的值可修改
3.const既修饰指针又修饰常量
均不可修改
二.static关键字
1.对于其他文件 隐藏全局函数和变量
所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。
const char a = 'A'; // global variable const void msg() { printf("Hello\n"); }
全局函数 变量 有static前缀后无法被其他文件访问
如果加了static,就会对其它源文件隐藏。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏.
2.将局部变量改变为全局变量,且无法再次被初始化
int fun(){ static int count = 10; //在第一次进入这个函数的时候,
变量a被初始化为10!以后每次进入该函数,a就不会被再次初始化了
return count--; }
int count = 1;//无效代码
3.static修饰的变量默认初始化为0
4.c++中的类成员声明static
在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
(3)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)
(4)静态成员初始化与一般数据成员初始化不同:
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;
初始化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值>
int Person::num=250
(5)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。
三.指针与引用的区别
引用和指针有什么区别?
本质:引用是别名,指针是地址,具体的:
①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。
②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值。
③ 从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。
④不存在指向空值的引用这个事实,意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。
⑤理论上,对于指针的级数没有限制,但是引用只能是一级。如下:
int** p1; // 合法。指向指针的指针
int*& p2; // 合法。指向指针的引用
int&* p3; // 非法。指向引用的指针是非法的
四、new与malloc的区别
1.malloc与free是c/c++的标准函数,new/delete是c++运算符
2.new可以自动化分析数据大小,自动执行构造函数、析构函数,malloc必须指定大小sizeof(int)

浙公网安备 33010602011771号