1.匿名类
先看一个例子
class A
{
public:
A(int a = 0)
:_a(a)
{
cout << "A(int a)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
void Print()
{
cout << _a << endl;
}
private:
int _a;
};
int main()
{
A aa1(10);
aa1.Print();
A(20).Print();//匿名类
return 0;
}
aa1就是就是有名类,如果我们直接给一个类进行构造就是匿名类
我们这么定义匿名对象,匿名对象的特点不用取名字, 但是他的生命周期只有这一行,我们可以看到下一行他就会自动调用析构函数。
2.编译器的优化
class A
{
public:
A(int a = 0)//默认构造
:_a(a)
{
cout << "A(int a)" << endl;
}
A(const A& aa)//拷贝构造
:_a(aa._a)
{
cout << "A(const A& aa)" << endl;
}
A& operator=(const A& aa)//赋值重载
{
cout << "A& operator=(const A& aa)" << endl;
if (this != &aa)
{
_a = aa._a;
}
return *this;
}
~A()//析构函数
{
cout << "~A()" << endl;
}
private:
int _a;
};
void f1(A aa)
{
}
A f2()
{
A aa;
return aa;
}
int main()
{
// 传值传参 aa1先进行构造 然后传值的话要拷贝构造
A aa1;
f1(aa1);
cout << endl<<endl;
// 传值返回
f2(); //传值返回 f2里面的类先进行构造,返回的话要一份临时变量的拷贝
//编译器直接优化成就直接返回构造好的,直接就是构造
cout << endl << endl;
// 隐式类型,连续构造+拷贝构造->优化为直接构造
f1(1);
cout << endl << endl;
// 一个表达式中,连续构造+拷贝构造->优化为一个构造
f1(A(2));//匿名函数进行构造之后 传值拷贝要进行拷贝构造
cout << endl << endl;
// 一个表达式中,连续拷贝构造+拷贝构造->优化一个拷贝构造
A aa2 = f2();
cout << endl << endl;
// 一个表达式中,连续拷贝构造+赋值重载->无法优化
aa1 = f2();//但是我们在f2里面已经优化成了构造,所以是构造加上赋值重载
cout << endl << endl;
return 0;
}
讲解在上面的代码区