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

c++中的构造函数注意事项

2017-09-07 20:41 295 查看
匿名对象构造后直接析构

#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++不在提供默认无参构造,但是会提供默认拷贝构造
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: