c++中的构造函数注意事项
2017-09-07 20:41
295 查看
匿名对象构造后直接析构
如果改为不是匿名的就是程序结束后再析构
默认情况下,c++编译器至少为我们写的类增加3个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对类中非静态成员属性简单值拷贝
如果用户定义拷贝构造函数,c++不会再提供任何默认构造函数
如果用户定义了普通构造(非拷贝),c++不在提供默认无参构造,但是会提供默认拷贝构造
#include<iostream> using namespace std; class person { public: person() { cout << "默认构造" << endl; } person(int a) { cout << "有参构造" << endl; } person(const person& p)//拷贝构造函数参数必须是引用,因为如果是对象(person p)的话,会无限递归调用构造下去, //例子:person p1=person p2,这时候调用p2的拷贝构造去初始化P1,p2的拷贝构造的参数是对象的话 //又要调用拷贝构造函数去初始化p2参数的对象, 再一次调用拷贝构造函数的时候,参数是对象,又要调用拷贝构造 //就这样一直递归下去,直到把栈撑爆,所以这样是错误的 //所以语法也规定不能这样定义 { cout << "拷贝构造" << endl; } ~person() { cout << "析构函数" << endl; } }; void test() { person(10);//调用有参构造,这是一个匿名的有参构造,匿名对象构造后直接析构 //person p(10); cout << "aaa" << endl; //person p2 = person(10);//调用有参构造,使用匿名构造初始化另一个对象,注意: 使用匿名对象初始化判断调用哪一个构造函数,要看匿名对象的参数类型 //person p2 = person();//调用默认构造 //b为person的实例化对象, person a = person(b) 和 person(b)的区别 //当person(b) 有变量来接的时候,那么编译器认为他是一个匿名对象,当没有变量来接的时候,编译器认为你A(b) 等价于 A b. //person b; //person a = person(b);//调用拷贝构造,b是一个匿名对象 //person(b)//等价于person b } person ret() { person p(10); return p; } void test2() { person p2 = ret();//vs release和QT下不调用拷贝构造(但是调用构造函数),编译器会做优化,多一次拷贝构造和析构开销也挺大的, //vs debug下调用一次拷贝构造 } int main() { test(); //test2(); getchar(); }结果如下:
如果改为不是匿名的就是程序结束后再析构
默认情况下,c++编译器至少为我们写的类增加3个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对类中非静态成员属性简单值拷贝
如果用户定义拷贝构造函数,c++不会再提供任何默认构造函数
如果用户定义了普通构造(非拷贝),c++不在提供默认无参构造,但是会提供默认拷贝构造
相关文章推荐
- [c++ primer plus]c++ compiler缺省生成了哪些构造函数?关于构造函数的注意事项。
- C++ 与“类”有关的注意事项总结(七):构造函数
- C++:在构造函数中使用new时应该注意的事项
- C++ 构造函数中使用new时注意事项
- c++的构造函数与析构函数区别和使用析构函数的注意事项g
- C++构造函数和析构函数中抛出异常的注意事项
- C++ 构造函数使用 ":成员变量(形参)" 的形式给类里面成员变量赋值,如果成员变量和形参是指针,那么需要注意的事项
- c语言及c++若干注意事项(逐步添加)
- VS 优化C++代码几点注意事项
- c++ shared_ptr智能指针使用注意事项
- Android NDK C++开发注意事项总结
- c++中define与inline的一些注意事项
- C++缺省参数的注意事项
- 谈NXopen C++和UGopen C混合开发之注意事项
- 原型优化构造函数时的注意事项
- C++中关于cons和字符串t的一些注意事项
- C/C++常用宏定义,注意事项,宏中#和##的用法
- C++中对类的提前引用声明注意事项
- 跨平台C、C++代码注意的事项
- c++模板注意事项