构造函数
你是不是这样认为:
(1)任何类如果没有定义默认构造函数,编译器就会合成一个;
(2)编译器合成的会明确社顶类中每个数据成员的默认值;
事实并非如此,只有C++编译器需要的时候才会合成个默认构造函数。
类中带有对象成员
class A{……};
class B
{
private:
A a; //对象成员
int x;
}
合成的构造函数
B::B( )
{
a.A::A();
}
假如你定义了个构造函数
A::A( )
{
x=0;
}
编译器会追加代码到里面去
A::A()
{
a.A::A();
x=0;
}
基类中有默认构造函数(包括被合成的)
和第一种一样,你定义了很多构造函数,编译器会追加代码到每个构造函数中
带有虚函数的类(包括纯虚函数)
编译器的必要的操作
(1)一个虚函数表将产生,内放虚函数的地址;
(2) 一个虚函数指针将产生,指向虚函数表地址;
所以编译器会为每个对象设定vptr的初始值,放置适当的虚函数表地址,对于类所定义的构造函数追加代码完成这些事。
虚继承
class X{publci: int i ; };
class A :public virtual X { public : int j ;};
class B: public virtual X { public: double d;};
class C: public A,public B{ public: int k;};
void foo(const A *pa) { pa->i=1024;} //无法在编译期决定出pa->X::i 的位置
main() {foo(new A); foo(new C);} // 可能转变为 void foo (const A*pa) { pa->_vbcx->i=1024} vbcx是对象指向类X的指针,当然要在构造函数中确定。
你是不是这样认为:
(1)任何类如果没有定义默认构造函数,编译器就会合成一个;
(2)编译器合成的会明确社顶类中每个数据成员的默认值;
事实并非如此,只有C++编译器需要的时候才会合成个默认构造函数。
类中带有对象成员
class A{……};
class B
{
private:
A a; //对象成员
int x;
}
合成的构造函数
B::B( )
{
a.A::A();
}
假如你定义了个构造函数
A::A( )
{
x=0;
}
编译器会追加代码到里面去
A::A()
{
a.A::A();
x=0;
}
基类中有默认构造函数(包括被合成的)
和第一种一样,你定义了很多构造函数,编译器会追加代码到每个构造函数中
带有虚函数的类(包括纯虚函数)
编译器的必要的操作
(1)一个虚函数表将产生,内放虚函数的地址;
(2) 一个虚函数指针将产生,指向虚函数表地址;
所以编译器会为每个对象设定vptr的初始值,放置适当的虚函数表地址,对于类所定义的构造函数追加代码完成这些事。
虚继承
class X{publci: int i ; };
class A :public virtual X { public : int j ;};
class B: public virtual X { public: double d;};
class C: public A,public B{ public: int k;};
void foo(const A *pa) { pa->i=1024;} //无法在编译期决定出pa->X::i 的位置
main() {foo(new A); foo(new C);} // 可能转变为 void foo (const A*pa) { pa->_vbcx->i=1024} vbcx是对象指向类X的指针,当然要在构造函数中确定。