有四种情况,会导致编译器必须为未声明constructor之classes合成一个default counstructor。
1)包含成员对象
2)base class的默认counstructor
3)为每一个对象初始化其virtual function机制
4)为每一个对象初始化其virtual base class机制
除却这四种情况,default counstructor 实际上并没有被合成出来。
两个常见的误解:
1)任何class如果没定义default counstructor,就会合成一个。、
2)编译器合成出来的default counstructor会明确设定class内每一个data member 的默认值。
没有一个是真的。
三种情况下Copy Counstructor的建构
1)
X x;
X xx = x;
2)void F(X x);
3)X F();
什么时候需要编译器合成Copy Counstructor
1)class 内含一个member object而后者的class声明有一个copy counstructor时。
2)class继承自一个base class 而后者存在一个copy counstructor时。
3)当class声明有virtual function时。
4)当class继承串链中有virtual base class时。
关于vptr:
Bear yo;
Bear win = yo;
yo的vptr被设定指向Bear Class的virtual table,因此yo的vptr值拷贝给win的vptr是安全的。
当 ZooAnimal zo = yo; // 发生切割行为
zo的vptr不可以被设定指向Bear Class 的 virtual table
Copy Counstructor样式:
1)X x1 = x0;
2)X x2(x0);
3)X x3 = X(x0);
使用第二种提高效率:
X fun()
{
X x;
return x;
}
X fun()
{
return X();
}
这回改变内部的vptr,构造函数被扩张时,vptr在memset之前赋值。
class Shape
{
Shape()
{
memset(this,0,sizeof(Shape));
}
};