一、default constructor---默认构造函数,亦即无参构造函数。从对象构造语义上讲,可分为以下2种:1)trivial 平凡的,可以理解为浅构造 2)notrivial 非平凡的,可以理解为深构造。当一个class没有显式地(explicitly)声明或定义任何constructor的时候,一个default constructor就会被编译器隐式地(implicitly)声明或定义出来。那么这个implicitly default constructor到底是trivial还是notrivial的呢?对于一个class,当存在以下4种情况时,其implicitly default constructor就是notrivial的。
(1)class内含一个或多个成员对象(member object),且这些member object中至少一个存在default constructor(无论是显式的default constructor还是隐式的notrival default constructor)
(2)class派生自一个继承串链,其中至少有一个base class存在default constructor(再次强调,无论是显式的default constructor还是隐式的notrival default constructor)
(3)class声明一个或多个虚函数(virtual function)
(4)class派生自一个继承串链,其中至少有一个虚基类(virtual base class),而不管这些virtual base class是否存在default constructor
显而易见,这4种情况是正交的,当不存在以上4种情况时,其implicitly default constructor就是trivial的。只有notrivial的default constructor才会被编译器真正生成,而trivial的不会生成。
二、copy constructor---拷贝构造函数,亦即带有当且仅有一个参数,类型为同类对象的构造函数。从对象拷贝语义上讲,可分为以下2种:1)bitwise copy 位拷贝,可以理解为浅拷贝 2)no bitwise copy 非位拷凡,可以理解为深拷贝。当一个class没有显式地声明或定义copy constructor时,一个copy constructor就会被编译器隐式地声明或定义出来。那么这个implicitly copy constructor到底是bitwise copy还是no bitwise copy的呢?对于一个class,当存在以下4种情况时,其implicitly copy constructor就是no bitwise copy的。
(1)class内含一个或多个成员对象,且这些member object中至少一个存在copy constructor(无论是显式的copy constructor还是隐式的no bitwise copy constructor)
(2)class派生自一个继承串链,其中至少有一个base class存在copy constructor(再次强调,无论是显式的copy constructor还是隐式的no bitwise copy constructor)
(3)class声明一个或多个虚函数
(4)class派生自一个继承串链,其中至少有一个虚基类,而不管这些virtual base class是否存在copy constructor
显而易见,这4种情况是正交的,当不存在以上4种情况时,其implicitly copy constructor就是bitwise copy的。只有no bitwise copy的copy constructor才会被编译器真正生成,而bitwise copy的不会生成。
三、对于defualt constructor,当一个class内显式地存在constructor(包括default constructor)时,编译器不会再生成它,但如果这个class满足以上4种情况至少一种时,编译器就需要负责执行相关的初始化:对于(1)要调用成员对象的default constructor;对于(2)要调用基类的default constructor;对于(3)要设定虚函数表的指针;对于(4)要设定虚基类的指针和偏移量。而这些初始化在用户代码执行前。
四、对于copy constructor,当一个class内显式地存在copy constructor时,编译器不会再生成它,但如果这个class满足以上情况(3)或(和)(4)时,编译器就需要负责执行相关的拷贝:对于(3)要决定怎么设定虚函数表指针。对于(4)要决定怎么设定虚基类的指针和偏移量。同理类推,如果这个class满足情况(1)或(和)(2),而且其成员对象或基类子对象又满足情况(3)或(和)(4)时,编译器也需要负责执行相关的拷贝了。而这些拷贝在用户代码执行前。
posted on 2011-08-31 11:40
春秋十二月 阅读(4926)
评论(0) 编辑 收藏 引用 所属分类:
C/C++