C++编译器何时提供默认的构造函数和拷贝构造函数
来源:互联网 发布:js math 向上取整 编辑:程序博客网 时间:2024/05/19 16:35
注意:默认构造函数并不是一定会生成的
如:
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++构造与析构(14) - 编译器何时创建默认构造函数和拷贝构造函数
- C++编译器何时为用户提供默认构造函数
- C++编译器何时为用户提供默认构造函数
- C++编译器何时为用户提供默认构造函数
- C++编译器何时为用户提供默认构造函数
- 编译器何时调用默认构造函数
- 浅拷贝——C++编译器默认提供的拷贝构造函数
- C++何时才提供默认构造函数
- 默认构造函数和拷贝构造函数
- 默认构造函数和拷贝构造函数
- C++编译器提供默认构造函数的几种情况
- 编译器提供默认构造函数的几种情况
- 何时调用C++复制构造函数和拷贝构造函数
- 何时调用C++复制构造函数和拷贝构造函数
- C++编译器合成默认构造函数的条件(合成默认拷贝构造函数雷同)
- 何时调用拷贝构造函数
- 随机漫步理论
- calendar设置月份容易忽视的问题
- http://poj.org/problem?id=1840
- 有效使用伪代码的指导原则
- SQL 如何设置自动标识增量,查看本机实例名
- C++编译器何时提供默认的构造函数和拷贝构造函数
- 图书馆管理系统的c实现
- darwin类结构整理
- 自学Groovy第二步——Grails环境搭建
- 通过exe文件,获取程序版本号,公司名称等信息
- 双击.dsw文件时另开VC6.0,而不会关掉原来已打开的项目的解决办法(转载)
- ExtJS之 Proxy数据代理
- 【数论】Non-Decreasing Digit
- 转载]cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)