博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++对象模型】函数返回C++对象的问题
阅读量:4322 次
发布时间:2019-06-06

本文共 1379 字,大约阅读时间需要 4 分钟。

在深入C++对象模型中,对于形如

CObj obj1 = Get(obj2);

的形式,编译器会在将其改变为如下

Get(obj, CObj&  obj1);

将赋值操作符左边的变量作为函数的一个引用参赛,在函数内部改变其值;

 

如下

#include "stdafx.h"#include 
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; //不返回任何值  }

 

 

 

 

所以,当函数的返回值为类对象时,要注意其构造函数的编写。

 

 

 

转载于:https://www.cnblogs.com/cuish/p/3737983.html

你可能感兴趣的文章
MySql中的变量定义
查看>>
Ruby数组的操作
查看>>
hdu1181暴搜
查看>>
解码字符串 Decode String
查看>>
json学习笔记
查看>>
工具:linux 性能监控工具-nmon
查看>>
fatal error C1853
查看>>
Ural 1001 - Reverse Root
查看>>
玩转webpack之webpack的entry output
查看>>
java 操作mongodb查询条件的常用设置
查看>>
黑马程序员_java基础笔记(02)...java语言基础组成
查看>>
关于缓存击穿
查看>>
对innodb 拷贝文件实现数据库的方式(转)
查看>>
python知识点 2014-07-09
查看>>
FloatingActionButton的一点学习感悟
查看>>
ABAP CDS ON HANA-(10)項目結合して一つ項目として表示
查看>>
网站地址信息
查看>>
产品经理 - 登录 注册
查看>>
小白的python进阶历程------05.占位符
查看>>
CF414BMashmokh and ACMDP
查看>>