nontrivial default constructor(重要的默认构造函数)---四种情况
来源:互联网 发布:windows 映射 编辑:程序博客网 时间:2024/05/21 10:33
一,“带有Default Constructor”的Member Class Object。如果一个class没有任何的constructor,但它内含一个member object,而后者有default constructor,那么这个class的implicit default constructor就是“nontrivial”,编译器需要为该class合成一个defaul constructor。
class Foo{ public: Foo, Foo(int) ...};class Bar { public: Foo foo, char *str;}; //译注:不是继承,是内含!void foo_bar(){ Bar bar; //Bar::foo必须在此处初始化 //译注:Bar:;foo是一个member object,而其class Foo拥有default constructor. if(str) { } ...}
程序员也可以自己定义:
Bar::Bar(){ foo.Foo::Foo(); //附加的compiler code(编译器代码) str = 0; //explicit user code(显示代码)}
二,“带有Default Constructor”的Base Class。如果一个没有任何constructor的class派生自一个“带有default constructor”的base class,那么这个derived class的default class的default constructor会被视为nontrivial,并因此需要被合成出来。
class A1{public: A1(){cout<<"A1 construction"<<endl;}};class A2{public: A2(){cout<<"A2 construction"<<endl;}};class A3: public A1, public A2//注意,这里为声明的顺序{public: A3(){ A3::A2(); A3::A1(); cout<<"A3 construction"<<endl; }};int main(int argc, char* argv[]) { A3 a; return 0}
运行该程序,发现结果如下:
A1 construction
A2 construction
A2 construction
A1 construction
A3 construction
Process returned 0 (0x0) execution time : 0.187 s
Press any key to continue.
// 前两行为编译器调用的,后两行为显示调用的 基类的构造函数
三,“带有一个Virtual Function”的Class。
class Widget{public: virtual void flip() = 0; // ...};void flip( const Widget& widget ) { widget.flip(); }//假设Bell和Whistle都派生自Widgetvoid foo(){ Bell b; Whistle w; flip(b); flip(w);}
下面两个扩张行动会在编译期间发生:
1,一个virual function table(在cfront中被称为vtbl)会被编译器产生出来,内放class的virtual function地址。
2,在每一个class object中,一个额外的pointer member(也就是vptr)会被编译器合成出来,内含相关之class vtbl的地址。
四,“带有一个Virtual Base Class”的Class。对于一个没有任何constructor的class,编译器会为它合成一个default constructor,在这个default constructor中会安插那些“允许每一个virtual base class的执行期存取操作”的代码。
class X { public: 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;};// 无法在编译期决定pa->X::i的实际偏移位置void foo(const A* pa) {pa->i = 1024;}main(){ foo(new A); foo(new B);}
该程序中,编译器无法固定住foo()之中“经由pa而存取的X::i”的实际偏移位置,因为pa的真正类型可以改变。编译器必须改变“执行存取操作”的那些代码,使X::i可以延迟至执行期才决定下来。
- nontrivial default constructor(重要的默认构造函数)---四种情况
- 默认构造函数(Default constructor)的构造操作
- 编译器需要implicit nontrivial default constructor情况
- default constructor(默认构造函数)
- 深度了解default constructor(深度了解默认构造函数)
- [C++]default constructor默认构造函数
- default constructor 的构造函数
- 关于nontrivial default constructor(一)
- 关于nontrivial default constructor(二)
- C++ 编译器生成默认构造函数的四种情况
- C++会生成默认构造函数的四种情况
- C++ 编译器生成默认构造函数的四种情况
- C++ 编译器生成默认构造函数的四种情况
- 关于默认构造函数的几个错误认识(四种情况下,编译器会生成默认构造函数)
- 构造函数的寓意:default constructor
- 【SpringBoot】“没有默认的构造器”,No default constructor found;
- 构造函数语义学---default constructor
- 默认的拷贝构造函数copy constructor
- elasticsearch的javaAPI之query
- Thrift 使用方法
- ASI和AFN实现POST异步请求的同样功能的代码
- 动态改变数组的长度
- JFace TreeViewer使用
- nontrivial default constructor(重要的默认构造函数)---四种情况
- vim代码自动补全函数提示设置
- Objective-C基础笔记(2)@property和@synthesize
- 模型的平移
- HTML 块级元素和行内元素
- R包实践:lubridate 处理时间数据
- Magento中创建商品时的Recurring Profile
- 实验一,调试
- ubuntu下git使用总结