chenhanzhun的技术博客

概述

在 class 中,若程序员没有为该 class object 定义 default constructors,则编译器会根据需要产生一个 implicit default constructor,该 implicit default constructor 被认为是 trivial(无用的)。那编译器怎样才能产生一个 nontrivial implicit default constructor?以下四个方面会产生nontrivial implicit default constructor: 1. class 中存在带有 default constructor 的 member class object(成员对象); 2. class 继承自带有 default constructor 的 base class(基类); 3. 带有一个 virtual function 的 class; 4. 带有一个 virtual base class 的 class;

带有 default constructor 的 member class object

若一个 class 中没有定义任何 constructor,但是 class 中存在带有 default constructor 的 member class object,则编译器会在需要的时候合成一个 nontrivial implicit default constructor;例如:

; class Foo { public:Foo() { cout << “The constructor of Foo was exist.” << endl; }}; class Bar { public:Foo foo;int x; }; int main() {Bar bar;if(bar.x){cout<<“The value of x is: “<<bar.x<<endl;}return 0; }

使用 gdb 调试结果如下所示:

(gdb) rStarting program: /ObjectModel/chap02/test Breakpoint 1, main () at test.cpp:1818Bar bar; (gdb) sBar::Bar (this=Bar { (gdb) sFoo::Foo (this=0xbffff038) at test.cpp:77Foo() { cout << “The constructor of Foo was exist.” << endl; }(gdb) sThe constructor of Foo was exit.main () (bar.x)(gdb) s21cout<<“The value of x is: “<<bar.x<<endl;(gdb) sThe value ;

从调试结果可以知道,执行Bar bar语句时,编译器会合成一个 Barnontrivial implicit default constructor,合成的 Barnontrivial implicit default constructor 内含必要的代码,能够调用 class Foo的 default constructor 来处理 member class objectBar::foo,但是并不会产生代码来初始化 Bar::x,将Bar::foo初始化是编译器所做的事,而初始化Bar::x则是程序编写者的事情;编译器会合成一个 Barnontrivial implicit default constructor 类似如下代码所示:

{foo.Foo::Foo();}

由于编译器合成的 Barnontrivial implicit default constructor 并没有对 Bar::x进行初始化,因此,被合成的 nontrivial implicit default constructor 只是满足编译器的需求,并不是程序员的需求,若要满足程序员需求必须初始化 Bar::x,例如:

Bar::Bar(){x=0;}

上面显示的默认构造函数,编译器同样会初始化 member class objectfoo,即相当于:

Bar::Bar(){ foo.Foo::Foo();x = 0;}

若class A内含一个或一个以上的 member class objects,则class A的每一个 constructor 必须安装声明的顺序调用每一个 member classes 的 default constructor。例如:

; class A { public:A() { cout << “class A” << endl; } }; class B { public:B() { cout << “class B” << endl; } }; class C { public:C() { cout << “class C” << endl; } }; class D{public:B b;A a;C c;public:int x;};int main(void) {D c;if(c.x){cout<<“noninitial the x “<<endl;}return 0; }

输出结果:从结果可知道,编译器合成的 nontrivial implicit default constructor 会按照 member objects 在 class 中的声明顺序调用各个 constructors。

(gdb) rStarting program: /ObjectModel/chap02/test Breakpoint 1, main () at test.cpp:3131D c; (gdb) sD::D ({(gdb) sB::B (this=0xbffff038) at test.cpp:1212B() { cout << “class B” << endl; } (gdb) sclass BA::A (this=0xbffff039) at test.cpp:77A() { cout << “class A” << endl; } (gdb) sclass AC::C (this=0xbffff03a) at test.cpp:1717C() { cout << “class C” << endl; } (gdb) sclass Cmain () at test.cpp:(c.x)(gdb) s34cout<<“noninitial the x “<<endl;(gdb) snoninitial the x ; 带有 default constructor 的 base class

若一个没有任何 constructors 的 class 继承一个带有 default constructor 的 base class,那么编译器合成的 derived class 的 default constructor 也是 nontrivial 的,它将按照顺序调用 base class 的 default constructor;

; class BaseClass { public:BaseClass() { cout << “Base class” << endl; } }; class Foo { public:Foo() { cout << “class Foo” << endl; } }; class Bar: public BaseClass { public:Foo foo;int x; }; int main() {Bar bar;if(bar.x){cout << bar.x<<endl;}return 0; } 可以一个人,可以几个人,一起放松那劳累的心情或者劳累自己的身体,

chenhanzhun的技术博客

相关文章:

你感兴趣的文章:

标签云: