首先,
类内有六个默认的函数:
1、构造函数2、拷贝构造3、析构函数4、赋值语句5、取值运算符6、取常地址运算符
然后,为了解释好下面的一些小知识点要先创建一个TEST类,如下。
class Test
{
public:
Test(int d = 0) : data(d)
{
cout<<"Create Obj : "<<this<<endl;
}
Test(const Test &t)
{
cout<<"Copy Create Obj : "<<this<<endl;
data = t.data;
}
//t2 = t1;
Test& operator=(const Test &t)
{
cout<<"Assign:"<<this<<" = "<<&t<<endl;
if(this != &t)
{
data = t.data;
}
return *this;
}
~Test()
{
cout<<"Free Obj : "<<this<<endl;
}
public:
Test* operator&()
{
return this;
}
const Test* operator&()const
{
return this;
}
public:
int GetData()const
{return data;}
private:
int data;
};
<1.>看看C++背着我们在后面干了好多事。
void fun(Test t)
{
int val = t.GetData();
Test tmp(val); //3、构造函数tmp
} //4、析构掉tmp
void main()
{
Test t; //1、构造函数t //5、析构
fun(t); //2、拷贝构造函数t //6、析构
}
Test fun(Test x)
{
int val = x.GetData();
Test tmp(val); //4、构造函数tmp //6、析构掉tmp
return tmp; //5、拷贝构造一个临时对象
} //7、析构掉传进来的拷贝构造
void main()
{
Test t; //1、构造函数t //11、析构
Test t1; //2、构造函数t1 //10、析构
t1 = fun(t);//3、拷贝构造个一样的t //8、把临时对象赋值给t1 //9、赋完值后立马析构掉
}
Test fun(Test &x)
{
int val = x.GetData();
Test tmp(val);//3、构造函数tmp
return tmp; //4、拷贝构造个临时对象
} //5、函数结束析构掉tmp
void main()
{
Test t; //1、构造函数t //9、析构
Test t1; //2、构造函数t1 //8、析构
t1 = fun(t); //传引用所以不再拷贝构造也备份 //6、临时对象赋完值后 7、立马析构掉
}
Test fun(Test &x)
{
int val = x.GetData();
return Test(val); //3、构造函数(构造临时变量),编译器自动把它当做临时变量而不再去拷贝构造临时变量。
}
void main()
{
Test t; //1、构造函数 //6、析构
Test t1; //2、构造函数 //5、析构
t1 = fun(t); //这里不再拷贝构造个t,因为上面是传引用//4、赋值完后立马析构掉
Test& fun(Test &x)
{
int val = x.GetData();
Test tmp(val); //3、构造tmp
return tmp;
} //4、析构tmp //因为引用返回所以不用创建临时变量
void main()
{
Test t; //1、构造t //6、析构
Test t1; //2、构造t1 //5、析构
t1 = fun(t); //3、赋值(注意这里容易引起错误,因为赋过来的值已经析构掉了)
}
//终结简洁版!!!
Test fun(Test &x)
{
int val = x.GetData();
return Test(val);
}
void main()
{
Test t;
Test t1 = fun(t);
}
一个对象只能拷贝构造一次,return回来只能是个临时的无名对象。
return Test(val)//创建临时对象。
在编译器中直接调用构造一个对象充当了临时无名对象。而不再去拷贝构造新的一个临时构造函数。节省时间。