【C++对象模型】函数返回C++对象的问题
在深入C++对象模型中,对于形如
CObj obj1 = Get(obj2);
的形式,编译器会在将其改变为如下
Get(obj, CObj& obj1);
将赋值操作符左边的变量作为函数的一个引用参赛,在函数内部改变其值;
如下
#include "stdafx.h"
#include <iostream>
using namespace std;
class CTest
{
public:
CTest(int a, int b);
virtual ~CTest();
CTest(const CTest& obj);
CTest& operator=(const CTest& obj);
protected:
int m_nValue1;
int m_nValue2;
};
CTest::CTest(int a, int b) : m_nValue1(a), m_nValue2(b){cout << "构造函数被调用\r\n";}
CTest::~CTest(){}
CTest::CTest(const CTest& obj)
{
cout << "拷贝构造函数被调用\r\n";
this->m_nValue1 = obj.m_nValue1;
this->m_nValue2 = obj.m_nValue2;
}
CTest& CTest::operator=(const CTest& obj)
{
cout << "重载赋值运算符\r\n";
this->m_nValue1 = obj.m_nValue1;
this->m_nValue2 = obj.m_nValue2;
return *this;
}
返回类对象的函数
CTest get(CTest obj)
{
CTest objTemp = obj;
return objTemp;
}
main函数及执行结果
int _tmain(int argc, _TCHAR* argv[])
{
CTest obj(10, 20);
CTest obj2 = get(obj);
return 0;
}
上述代码,构造函数被调用一次,拷贝构造被调用三次,重载的赋值运算符没有被调用;
调用时机:
构造函数:
CTest obj(10, 20);
拷贝构造函数:
①调用get函数时,将实参传递给get函数时,需要调用拷贝构造函数拷贝一个实参obj的副本
②get函数内部, CTest objTemp = obj;
③函数返回之前,将objTemp的作为拷贝构造的参数拷贝构造obj2;
所以,get函数被改编为如下
CTest obj2; //不执行其构造函数
void get(CTest obj/*obj参数不变*/, CTest& __result /*附加参数*/)
{
//处理obj
__result.CTest::CTest(obj2) //拷贝构造
return; //不返回任何值
}
所以,当函数的返回值为类对象时,要注意其构造函数的编写。
**********************技术交流请 email:cuihao0532#163.com 欢迎转载,转载请注明出处!***************************** 如果对本文满意请扫描文章左侧【二维码添加微信】获取更多好玩、有趣、有益、有营养的料,
你我共同成长!Y(^_^)Y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗