C++程序员经常问的问题

来源:互联网 发布:java线程优先级大小 编辑:程序博客网 时间:2024/04/30 21:13

要点9、优化成员的排列

  一个类的大小可以被下面的方式改变:   
struct A
{
 bool a;
 int b;
 bool c;
}; //sizeof (A) == 12  

 

1000

1111

1000 
  在我的电脑上sizeof (A) 等于12。这个结果可能会让你吃惊,因为A的成员总数是6个字节:1+4+1个字节。那另6字节是哪儿来的?编译器在每个bool成员后面都插入了3个填充字节以保证每个成员都是按4字节排列,以便分界。你可以减少A的大小,通过以下方式:   
struct B
{
 bool a;
 bool c;
 int b;
}; // sizeof (B) == 8   

 

1100

1111
  这一次,编译器只在成员c后插入了2个字节。因为b占了4个字节,所以就很自然地把它当作一个字的形式排列,而a和c的大小1+1=2,再加上2个字节就刚好按两个字的形式排列B。    

 

要点10、为什么继承一个没有虚析构函数的类是危险的?

  一个没有虚析构函数的类意味着不能做为一个基类。如std::string, std::complex, 和 std::vector 都是这样的。为什么继承一个没有虚析构函数的类是危险的?当你公有继承创建一个从基类继承的相关类时,指向新类对象中的指针和引用实际上都指向了起源的对象。因为析构函数不是虚函数,所以当你delete一个这样的类时,C++就不会调用析构函数链。举个例子说明:   
class A
{
 public:
 ~A() // 不是虚函数
 {
 // ...
 }
};
class B: public A //错; A没有虚析构函数
{
 public:
 ~B()
 {
 // ...
 }
};
int main()
{
 A * p = new B; //看上去是对的
 delete p; //错,B的析构函没有被调用
}   

 

要点11、以友元类声明嵌套的类

  当你以友元类声明一个嵌套的类时,把友元声明放在嵌套类声明的后面,而不前面。   
class A
{
 private:
 int i;
 public:
 class B //嵌套类声明在前
 {
  public:
  B(A & a) { a.i=0;};
 };
 friend class B;//友元类声明
};   
  如果你把友元类声明放在声明嵌套类的前面,编译器将抛弃友元类后的其它声明。  

原创粉丝点击