c++的构造函数
来源:互联网 发布:惠州市政务网络问政 编辑:程序博客网 时间:2024/06/16 05:19
c++的构造函数:
c++在什么时候编译器会合成一个默认构造函数呢?
第一:我们要明确编译器合成的构造函数有两种,第一种是trivial(没有任何用处的),第二种是notrivial(有用的).其实,第一种编译器什么工作也没做,即没合成,只不过换了一种说法,叫做合成trivial construction.第二:编译器在什么情况下会合成默认构造函数呢?(以下全部指notrivial construction)
合成默认构造函数的前提是程序员没有声明任何构造函数的情况下(如果程序员自定义了构造函数,编译器会向其中安插相应的初始化代码,且安插在用户显示的代码之前).
在以下四种情况,编译器会合成默认构造函数.
1.类成员对象有默认构造函数.
编译器会合成默认构造函数,并且在构造函数中按类成员对象的声明顺序添加class member construction.
2.基类有默认构造函数.(同上)
3.类中有virtualfunction
编译器要构造vptr,并指向其vtalbe.
4.类中有virtual baseclass(同上,只不过更复杂)
编译器在什么情况下合成default copy construction?
首先要明确一点,编译器在确定不是biwise copysemantics的情况下,才有可能合成default copy construction.什么情况不是biwise copysemantics呢,就是以下四种情况.
在以下四种情况,编译器会合成default copy construction.
1.类成员对象有default copyconstruction.
编译器会合成default copy construction,并且在default copy construction中按类对象成员的声明顺序依次调用类对象成员的default copyconstruction,这些操作均在用户显示代码之前.
2.基类有默认构造函数.(同上)
3.类中有virtualfunction
编译器要构造vptr,并指向正确的vtalbe.
4.类中有virtual baseclass(同上,只不过更复杂)
调用 copy construction的情况:
Aa=temp;
voidfunc(A a);
Afunc (){
returna;
}
定义一个拷贝构造函数
//参数必须是引用,否则递归调用,并且没有终止:
A::A(A&a){
…..
}
成员初始化类表
1.成员初始化列表是在显示的用户代码之前调用的.
2.初始化列表中的初始化顺序是按照其类中声明顺序,即编译器会按照声明顺序重新调整初始化列表中成员的顺序.
3.成员初始化列表是对成员进行定义(严谨的c++中把定义视为分配内存的行为)并同时初始化.
4.当程序执行用户显示代码时候,已经完成了所有类成员的初始化.即初始化函数中对成员的'='行为都是赋值行为(调用赋值操作符operator=).
有四种情况必须使用成员初始化列表:
1.const member
2.reference member
3.class member construction都有参数.
4.基类的构造函数都有参数.
- [C++]子类的构造函数
- [c++]类的构造函数
- C++-类的构造函数
- 【C/C++】构造函数的初始化列表
- <C++>14.构造函数的重载与拷贝构造函数
- C#-构造函数要注意的
- C 类对象的拷贝构造函数
- [C++] 拷贝构造函数的调用
- C++/CLI的静态构造函数
- (C++)定义类的拷贝构造函数
- 【C++&Java】构造函数的调用点
- C++, 类的构造函数 语法练习
- [C++] C++的拷贝构造函数浅析
- 【C++】c++类的构造函数详解
- 【C++】拷贝构造函数的剖析
- 【c++】构造函数调用顺序的研究
- C++:复制构造函数的应用
- c++/string的构造析构函数
- Java设计模式学习(一)
- iOS开发中 workspace 与 static lib 工程的联合使用
- LINUX下搭建FTP服务器
- Log4Net使用指南
- 关于IOS7中scrollview中subviews的frame看起不正确的问题
- c++的构造函数
- 一剪梅,隐约着一树温柔
- makefile中的patsubst .
- listView中定义GridView绑定失败
- 算法时间复杂度
- 百度的"深度学习"之路
- 用org.apache.poi将Excel里的数据导入数据库
- Javascript模块化编程(一):模块的写法
- 一次低级的错误耽误了一周时间