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个条件,并且类没有提供拷贝构造函数,编译器也会合成一个默认的拷贝构造函数,它用字节拷贝的方式拷贝对象。
如:
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个条件,并且类没有提供拷贝构造函数,编译器也会合成一个默认的拷贝构造函数,它用字节拷贝的方式拷贝对象。
相关文章推荐
- C++编译器何时提供默认的构造函数和拷贝构造函数
- 浅拷贝——C++编译器默认提供的拷贝构造函数
- C++编译器何时为用户提供默认构造函数
- C++构造函数语意学——默认拷贝构造函数
- 十、构造函数和析构函数(四) 拷贝构造函数、默认拷贝构造函数、拷贝构造函数调用几种情况、深拷贝浅拷贝、构造函数和=操作符区别、禁止对象拷贝
- 第二章 构造函数语意学 编译器何时合成拷贝构造函数?
- 什么情况下C++编译器会生成默认的构造函数
- 浅拷贝——C++编译器默认提供的赋值运算符
- c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数
- C++编译器何时为用户提供默认构造函数
- C++编译器何时为用户提供默认构造函数
- C++编译器何时为用户提供默认构造函数
- C++编译器合成默认构造函数的条件(合成默认拷贝构造函数雷同)
- C++编译器何时为用户提供默认构造函数
- 什么情况下C++编译器会生成默认的构造函数
- 实现C++类中默认的四个方法默认构造函数、析构函数、拷贝构造函数、赋值函数
- 关于c++默认的构造函数、析构函数、拷贝构造函数、move函数
- C++中,编译器会默认提供的构造函数有哪几种? C++中默认构造函数有几种,详细描述每一种。
- 为什么有必要给父类提供默认的构造函数?
- 关于对构造函数和拷贝构造函数的理解