C++面试秘笈笔记
c++程序基础
1.sizeof(str)数组中要保留结束符(需+1),数组变量和指针一样 在win32下为4个字节
虚函数指针表占4个字节 static成员变量属于类域 不算入对象为0,对齐原则(不同类型之间 且默认为4) ,空类为1 对于union联合体的大小取决于他所有成员占用空间最大的成员大小
2.sizeof与strlen区别
char str[20]="1234567890";
sizeof(str)=20; strlen(str)=10;
char* ss="1234567890";
sizeof(ss)=4 strlen(ss)=10;
3.为何引入内联函数:替代宏定义来解决程序中函数调用的效率问题
宏定义缺点:无法对参数进行有效性检测 不可强制转化 如果涉及类和类的访问 则无法实现(inline可以解决这些问题)
两者区别: 内联函数在编译时展开,宏在预编译时展开
编译时 内联函数直接镶嵌在目标代码中,,宏简单文本替换
注意参数的二义性
4.不宜使用内联函数(以代码膨胀为代价)的情况: 代码较长,函数体内有循环
指针和引用
1. a=10;
int &rn=a;//rn是a的一个引用
rn=100;//rn的值改变就是a的改变 则a 也为100
&a=&rn//此时&为取址符 rn和a占内存中同一存储单元
2.引用和指针的区别:
引用必须被初始化,指针不必初始化(未初始化时为野指针,危险)
引用初始化后不能改变引用对象 而指针可以改变指向对象
不存在指向空值的引用 但存在指向空值的指针
测试需要区别:由于引用不会指向空值,引用前则不需要测试它的合法性;而指针则需要(安全性)
应用的区别:如果指向对象不变,则使用引用,如果有指向NULL或者不同时刻指向对象不同则使用指针
3.指针赋值
char a[]="hello world'' ;
char* p=a;
*(p+4)+=1;//*(p+4)指向o,+1后为p
4.指针的加减操作
int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);//&a是对象(数组)的地址,此时为a[5]的地址,已经越界
*(a+1);//a+1为数组下一个元素的地址
5.指针比较
char str1[]="abc";
char str2[]="abc";
char *str3="abc";
const char* str4="abc";
cout<<"str1==str2"<<endl;//输出为0,str1,str2在栈中分配,但位置不同
cout<<"str3==str4"<<endl;//输出为1,"abc"放在数据区,这两个指针指向同一个内存位置
6.指针常量与常量指针区别
int const *p1 = &b;//const 在前,定义为常量指针
int *const p2 = &c;//*在前,定义为指针常量
常量指针p1:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。
p1 = &a是正确的,但 *p1 = a是错误的。
指针常量p2:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。
p2= &a是错误的,而*p2 = a 是正确的。
7.类的非静态成员函数才有this指针
8.指针数组与数组指针区别
指针数组:一个数组里存放的是同一类型的指针
int* a[10];//占用40位字节
数组指针:一个指向一维或多维数组的指针
int* b=new int[10];//需要delete[]防止内存泄漏
9.野指针
野指针成因:(1)指针变量为初始化 (2) p被free或者delete后没有置为NULL
10.malloc与free是C库函数,new与delete是C++运算符,都用于申请动态内存和释放内存
对类而言,malloc不能调用析构函数和构造函数,但new可以
11.内存的分配方式
(1)从静态存储区分配:全局变量,常量
(2)在栈上创建:局部变量
(3)从堆上分配:(动态分配内存)malloc new申请
字符串
1. 使用库函数将数字转化为字符串
itoa(num_int,str_int,10);//把整数转化为str,为十进制的转化
gcvt(num_double,8,str_double);//把浮点型转化为str,8表示精确位数
2.位运算:
左移操作<<相当于乘2,
右移操作<<相当于除以2
x|=y; 等价于x=x|y; 为位运算里面的或
x&=~y 等价于 x=x&(~y); 先对y取反 再和x做与运算
3.#define 中UL(无符号长整型)放在最尾,
不能以分号结束
4.关键字static的作用是什么
(1)在函数体内,静态变量在被调用过程中保持不变
(2)在模块内(函数体外),可以被模块内所有函数访问,为本地的全局变量
5.volatile含义:优化器在用到这个变量时必须每次小心重新读取这个变量的值,而不是使用寄存器中的备份
C++面向对象
1.C/C++最大区别:
C是面向过程的编程语言,它以过程为中心,以算法为驱动;
C++时面向对象的,即使用以对象为中心,以消息为驱动的编程方式.
2.class和strcut区别:
(1)C语言中struct只是作为一种复杂数据类型的定义,不是面向对象
(2)class默认是private,struct默认为public,且class还可用于表示模板类型