c++面试宝典1.0
2016-10-14 22:01
218 查看
宏定义
1.宏定义展开容易造成二义性问题
//#define SQR(x) (x*x)
a =SQR(b+2)展开后为b+2*b+2而不是”(b+2)*(b+2)”
若要平方形式对表达式适用,可以把宏定义改为
//#define SQR(x) ((x)*(x))
Const
2.const有什么用途?
在C程序中,const的用法主要有定义常量,修饰函数蚕食,修饰函数返回值等三个用处。在C++程序中,它还可以修饰函数的定义体,定义类中某个成员函数为恒态函数,即不改变类中的数据成员。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
3.const与#define相比有什么不同
const常量有数据类型,而红常量没有数据类型。编译器可以对前者进行安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效用)
有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中只使用const常量而不是用宏常量,即const常量完全取代宏常量(这里我也纠结了~~原文上面还说也可以使用#define定义常量来着,只是const有更多有点)
C中const的意思是“一个不能被改变的普通变量”。在C中,它总是占用内存,而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量。在C中,如果写:
const bufsize=100;
char buffer[bufsize];
将得到错误结果。因为bufsize占用内存的某个地方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:
const bufsize;
这样写在C++中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地方有内存分配。因为C默认const是外部连接,C++默认const是内部连接的。如果在C++中要完成与C同样的事情,必须用extern把内部连接改为外部连接。extern constbufsize;//declaration only
这种方法也可以用在C语言中。在C语言中使用限定符const不是很有用,即使是在常数表达式里(必须在编译期间被求出)想使用一个已命名的值,使用cosnt也不是很有用。C迫使程序员在预处理器里使用#define。
Sizeof
指针的大小是一个定值,4
在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候便一结构的里面最长的数据元素为对其单位,即结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对其单位。但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。
CPU的优化规则大致原则是这样的:对于n字节的元素(n=2,4,8…),它的首地址能被n整除,才能获得最好的性能。设计编译器的时候可以遵循这个原则:对于每一个变量,可以从当前位置向后找到第一个满足这个条件的地址作为首地址。
对于一个类,即使它是一个空类,编译器仍然要给它一个空间,大小为1.
单一继承的空类空间也是1,多重继承的空类空间也是1.但是虚继承涉及到虚表(徐指针),大小为4
静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小
Ps:
char* ss=”0123456789”;
sizeof(ss)=4(ss是指向字符串常量的字符指针)
sizeof(*ss)=1(*ss是第一个字符)
char ss[]=”0123456789”;
sizeof(ss)=11(ss是数组,计算到’\0’位置,因此是10+1)
sizeof(*ss)(*ss是第一个字符)
char ss[100]=”0123456789”;
sizeof(ss)=100(ss表示内存中预分配的大小)
strlen(ss)=10(它的内部实现是用一个循环计算字符串的长度,直到”\0”为止)
int ss[100]=”0123456789”;
sizeof(ss)=400(100×4)
strlen(ss)错误(strlen的参数只能是char*,而且必须是以”\0”结尾的)
1.宏定义展开容易造成二义性问题
//#define SQR(x) (x*x)
a =SQR(b+2)展开后为b+2*b+2而不是”(b+2)*(b+2)”
若要平方形式对表达式适用,可以把宏定义改为
//#define SQR(x) ((x)*(x))
Const
2.const有什么用途?
在C程序中,const的用法主要有定义常量,修饰函数蚕食,修饰函数返回值等三个用处。在C++程序中,它还可以修饰函数的定义体,定义类中某个成员函数为恒态函数,即不改变类中的数据成员。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
3.const与#define相比有什么不同
const常量有数据类型,而红常量没有数据类型。编译器可以对前者进行安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效用)
有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中只使用const常量而不是用宏常量,即const常量完全取代宏常量(这里我也纠结了~~原文上面还说也可以使用#define定义常量来着,只是const有更多有点)
C中const的意思是“一个不能被改变的普通变量”。在C中,它总是占用内存,而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量。在C中,如果写:
const bufsize=100;
char buffer[bufsize];
将得到错误结果。因为bufsize占用内存的某个地方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:
const bufsize;
这样写在C++中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地方有内存分配。因为C默认const是外部连接,C++默认const是内部连接的。如果在C++中要完成与C同样的事情,必须用extern把内部连接改为外部连接。extern constbufsize;//declaration only
这种方法也可以用在C语言中。在C语言中使用限定符const不是很有用,即使是在常数表达式里(必须在编译期间被求出)想使用一个已命名的值,使用cosnt也不是很有用。C迫使程序员在预处理器里使用#define。
Sizeof
指针的大小是一个定值,4
在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候便一结构的里面最长的数据元素为对其单位,即结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对其单位。但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。
CPU的优化规则大致原则是这样的:对于n字节的元素(n=2,4,8…),它的首地址能被n整除,才能获得最好的性能。设计编译器的时候可以遵循这个原则:对于每一个变量,可以从当前位置向后找到第一个满足这个条件的地址作为首地址。
对于一个类,即使它是一个空类,编译器仍然要给它一个空间,大小为1.
单一继承的空类空间也是1,多重继承的空类空间也是1.但是虚继承涉及到虚表(徐指针),大小为4
静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小
Ps:
char* ss=”0123456789”;
sizeof(ss)=4(ss是指向字符串常量的字符指针)
sizeof(*ss)=1(*ss是第一个字符)
char ss[]=”0123456789”;
sizeof(ss)=11(ss是数组,计算到’\0’位置,因此是10+1)
sizeof(*ss)(*ss是第一个字符)
char ss[100]=”0123456789”;
sizeof(ss)=100(ss表示内存中预分配的大小)
strlen(ss)=10(它的内部实现是用一个循环计算字符串的长度,直到”\0”为止)
int ss[100]=”0123456789”;
sizeof(ss)=400(100×4)
strlen(ss)错误(strlen的参数只能是char*,而且必须是以”\0”结尾的)