2008年08月27日 星期三 10:16
总的来说,编译器只在它需要的时候才会合成一个默认构造函数,或者扩张所有已存在的构造函数。
一个类满足下列其中任何一个条件:
1.包含了一个类的对象,这个对象有一个构造函数(包括编译器合成的默认构造函数)
2.如果继承自一些基类,其中某些基类有一个构造函数(包括编译器合成的默认构造函数)
3.有一个虚函数,或者继承到了虚函数
4.有虚基类
如果这个类没有默认的构造函数,编译器就会合成一个默认的构造函数,分别做以下事情
如果这个类有构造函数,编译器就会扩张所有构造函数,做以下事情
1.调用这个对象的构造函数
2.调用基类的构造函数
3.设置正确的虚函数表指针
4.设置指向虚基类对象的指针
如果一个类不满足上面的4个条件,并且没有提供构造函数,编译器也不会为这个类提供默认的拷贝构造函数。
拷贝构造函数类似,对于1,2,判断是否有拷贝构造函数,并调用拷贝构造函数,3,4相同。
但有一点截然不同,即使一个类不满足以上4个条件,并且类没有提供拷贝构造函数,编译器也会合成一个默认的拷贝构造函数,它用字节拷贝的方式拷贝对象。
这种东西实在有些无聊,不是为了找工作才不研究。
总的来说,编译器只在它需要的时候才会合成一个默认构造函数,或者扩张所有已存在的构造函数。
一个类满足下列其中任何一个条件:
1.包含了一个类的对象,这个对象有一个构造函数(包括编译器合成的默认构造函数)
2.如果继承自一些基类,其中某些基类有一个构造函数(包括编译器合成的默认构造函数)
3.有一个虚函数,或者继承到了虚函数
4.有虚基类
如果这个类没有默认的构造函数,编译器就会合成一个默认的构造函数,分别做以下事情
如果这个类有构造函数,编译器就会扩张所有构造函数,做以下事情
1.调用这个对象的构造函数
2.调用基类的构造函数
3.设置正确的虚函数表指针
4.设置指向虚基类对象的指针
如果一个类不满足上面的4个条件,并且没有提供构造函数,编译器也不会为这个类提供默认的拷贝构造函数。
拷贝构造函数类似,对于1,2,判断是否有拷贝构造函数,并调用拷贝构造函数,3,4相同。
但有一点截然不同,即使一个类不满足以上4个条件,并且类没有提供拷贝构造函数,编译器也会合成一个默认的拷贝构造函数,它用字节拷贝的方式拷贝对象。
这种东西实在有些无聊,不是为了找工作才不研究。