Effective C++ 笔记

      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++;
       }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值