1. Class A{private: int arr[num];}; 怎么实现一个数组的初始化?
答:如果编译器允许(应该允许)用“static整数型常量可以in class初值设定”,可以在前面声明static const int num=20;否则可以用enum{num=20};而且这样可以避免额外的内存分配,enum值不会被分配存储空间(绝不会),而const可能有些编译器会错误的分配。
2. C和C++在对待const时有什么不同?
答:C不会把const常量放入符号表,而是实际为其分配空间,所以常量值在编译期不可见。C++会把基本类型的const常量放入符号表(int,char,long,double),不论其为局部变量还是全局变量,但不会把自己定义的数据结构或者数组等常量放到符号表中。
3. C++中如何修改一个常量的值?修改后程序输出为?为什么?加上volatile呢?如果在C中呢?
const long lng = 100; // const volatile long lng = 100; => 20,20!!!
long * pLng = (long *)&lng;
*pLng = 20;
cout<<*pLng<<endl; (20)
cout<<lng<<endl; (100)
4. 类中Const成员怎么初始化?const成员函数能否修改非const成员?怎么修改?
答:只能通过初始化列表;
正常情况下不能,但有两种work around:
a. 在const成员函数中,((Y*)this)->member
b. 把member定义为mutable int member
5. 类实例化时的顺序?
6. C++中内存区域各有哪些?
答:
a. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
b. 堆,就是那些由 new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就 要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
c. 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
d. 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们 共同占用同一块内存区
e. 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
7. C++符号表?
8. Alloca: 在栈上分配内存,内存可被自动回收
malloc (size): 在堆上分配内存,用free回收
realloc 在已有内存上追加分配
calloc(size, number): 分配size*number大小的内存,并且将它们初始化为0,也用free释放
9. 编译器自动在类中生成什么代码?
10. #pragma pack(n)和#pragma pack()
struct sample
{
char a;
double b;
};
当sample结构没有加#pragma pack(n)的时候,sample按最大的成员那个对齐;
(所谓的对齐是指对齐数为n时,对每个成员进行对齐,既如果成员a的大小小于n则将a扩大到n个大小; 如果a的大小大于n则使用a的大小;)所以上面那个结构的大小为16字节. 当sample结构加#pragma pack(1)的时候,sizeof(sample)=9字节;无空字节。 (另注:当n大于sample结构的最大成员的大小时,n取最大成员的大小。所以当n越大时,结构的速度越快,大小越大;反之则小#pragma pack()就是取消#pragma pack(n)的意思了,也就是说接下来的结构不用#pragma pack(n)
11. union{
struct {
unsigned char s1:2;
unsigned char s2:3;
unsigned char s3:3;
} x
}v;
12. struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
} ;
如果用#pragma pack() 则sizeof(A) 为8,如果用#pragma pack(1)则sizeof(A)为6
13. 迭代器中删除元素,这是标准作法:
std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}