关于C++类内部的一些工作机制

本文探讨了C++类内部的默认函数,特别是取常地址运算符。通过创建TEST类的例子,揭示了C++在对象拷贝构造时的优化策略:当使用return返回对象时,编译器会直接构造一个临时无名对象,避免二次拷贝,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,

类内有六个默认的函数:

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)//创建临时对象。
在编译器中直接调用构造一个对象充当了临时无名对象。而不再去拷贝构造新的一个临时构造函数。节省时间。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值