匿名对象构造后直接析构
#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++不在提供默认无参构造,但是会提供默认拷贝构造