您的位置:首页 > 编程语言 > C语言/C++

C++编译器何时提供默认的构造函数和拷贝构造函数 .

2012-10-18 08:46 351 查看
注意:默认构造函数并不是一定会生成的

如:

class A

{

public:

int f() const {}

};

class B : public A

{

public:

int f() {}

};

A和B都没有生成默认构造函数,直接导致

const A a;

const B b;

出现如下错误:

uninitialized const `a'

uninitialized const `b'

总的来说,编译器只在它需要的时候才会合成一个默认构造函数,或者扩张所有已存在的构造函数。

一个类满足下列其中任何一个条件:

1.包含了一个类的对象,这个对象有一个构造函数(包括编译器合成的默认构造函数)

(在class A中增加一个string str即可)

2.如果继承自一些基类,其中某些基类有一个构造函数(包括编译器合成的默认构造函数)

(在class A中增加一个构造函数,B中就会自动生成默认构造函数)

3.有一个虚函数,或者继承到了虚函数

4.有虚基类

关于合适会生成默认构造函数,请看下面的说明:

如果这个类没有默认的构造函数,编译器就会合成一个默认的构造函数,分别做以下事情

如果这个类有构造函数,编译器就会扩张所有构造函数,做以下事情

1.调用这个对象的构造函数

2.调用基类的构造函数

3.设置正确的虚函数表指针

4.设置指向虚基类对象的指针

如果一个类不满足上面的4个条件,并且没有提供构造函数,编译器也不会为这个类提供默认的拷贝构造函数。

拷贝构造函数类似,对于1,2,判断是否有拷贝构造函数,并调用拷贝构造函数,3,4相同。

但有一点截然不同,即使一个类不满足以上4个条件,并且类没有提供拷贝构造函数,编译器也会合成一个默认的拷贝构造函数,它用字节拷贝的方式拷贝对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐