千家信息网

如何进行C++拷贝构造函数深入分析以及重写operator

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章将为大家详细讲解有关如何进行C++拷贝构造函数深入分析以及重写operator ,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。class C
千家信息网最后更新 2025年02月23日如何进行C++拷贝构造函数深入分析以及重写operator

这篇文章将为大家详细讲解有关如何进行C++拷贝构造函数深入分析以及重写operator ,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

CTestCopyConstruct GetTest() {
CTestCopyConstruct ret1;
ret1.strTest = " ok " ;
ret1.i = 0 ;
CTestCopyConstruct ret2;
return ret1;
}

void CTestDlg::OnOK()
{
CTestCopyConstruct var1;
CTestCopyConstruct var2 = GetTest();

TRACE( " /nresult 1:/n " );
TRACE( " var1 is %d/n " , & var1);
TRACE( " var2 is %d var2.str is %s/n/n " , & var2,var2.strTest);

CTestCopyConstruct var3 = var2;
CTestCopyConstruct var4;
var4 = var2;

TRACE( " /nresult 2:/n " );
TRACE( " var3 is %d var3.str is %s/n " , & var3,var3.strTest);
TRACE( " var4 is %d var2.str is %s/n " , & var4,var4.strTest);
}

代码如上,调试窗口输出如下:
Enter CTestCopyConstruct();this is 1242980
Enter CTestCopyConstruct();this is 1242848
Enter CTestCopyConstruct();this is 1242840
Enter CTestCopyConstruct(const CTestCopyConstruct &src);this is 1242972;src is 1242848

result 1:
var1 is 1242980
var2 is 1242972 var2.str is ok

Enter CTestCopyConstruct(const CTestCopyConstruct &src);this is 1242964;src is 1242972
Enter CTestCopyConstruct();this is 1242956
Enter CTestCopyConstruct & operator =(const CTestCopyConstruct & src);this is 1242956;src is 1242972

result 2:
var3 is 1242964 var3.str is ok
var4 is 1242956 var2.str is ok

分析:
CTestCopyConstruct var1;//1
CTestCopyConstruct var2 = GetTest();//2
代码的执行如下:
当前堆栈指针(sp) = 1242980
sp -= 8//在堆栈中为var1分配空间
在var1上(1242980 - 1242973)调用构造函数
sp -= 8//在堆栈中为var2分配空间
sp -= n//保护当前环境
进入了GetTest函数
当前sp = 1242848
sp -= 8//为ret1分配空间
构建ret1
sp -= 8//为ret2分配空间
构建ret2
......
对var2(1242972处的堆栈段)调用拷贝构造函数,以test1(1242848处)为参数
//析构test1 test2等...
sp += n//恢复运行环境
......

另:
operater = () 和默认构造函数不一样,只重写=运算符而不提供拷贝构造函数,调用的仍然是默认的构造函数。
默认构造函数和赋值运算符处理的情况不一样,一个是在已分配的空间上调用,一个是在已构造的对象上调用。

默认拷贝构造函数会调用类中各成员的拷贝构造函数。CString 由于提供了拷贝构造函数,所以上面例子中即使去掉拷贝构造函数,var2 仍然会得到正确的值。

调试的环境是vc6.0 debug 默认选项。编译没有优化。

CTestCopyConstruct( const CTestCopyConstruct & src)
:strTest (src.strTest) {
TRACE( " Enter CTestCopyConstruct(const CTestCopyConstruct &src);this is %d;src is %d/n " , this , & src);
i = src.i;
}

前者先调用了CString::CString()再调用CString::operator =
后者直接调用了CString::CString(CString & src);

默认的赋值运算的行为:首先调用父类的赋值运算。
然后会为自己独有的各成员寻找赋值运算。如果成员的赋值运算符被重写,则调用这个重写的赋值运算符函数,如果这个重写的运算符函数是private,编译将无法通过。
默认的拷贝构造函数的行为:首先调用父类的拷贝构造函数。
然后为自己独有的各成员寻找拷贝构造函数。如果这个成员提供拷贝构造函数,则调用之,如果成员的类提供的拷贝构造函数是private,编译将无法通过。
(子类完全可以把父类当成自己的一个成员?)

可以说默认的赋值运算和默认的拷贝构造函数是类最常被用到的两个函数了...内部却不是一般的复杂。

关于如何进行C++拷贝构造函数深入分析以及重写operator 就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

函数 拷贝 运算 成员 空间 运算符 分配 堆栈 分析 环境 编译 C++ 代码 内容 文章 是在 更多 知识 篇文章 行为 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 闪电公司网络安全 数据库设计 项目 高科技互联网夜景 幼儿园观看网络安全教育简报 图书借阅管理数据库各个表数据 网络安全专项治理风险清单 数据库的不安全性因素 基于内容的网络安全 员工网络安全意识ppt 计算机网络技术工业机器人 服务器 标识 win10用友数据库卸载 08系统服务器密码策略在哪里 天津电商软件开发语言 服务器上的圆柱指示灯代表什么 金山区自动化软件开发质量保障 学软件开发必看的书 网络安全专题网络培训心得体会 淮北小程序软件开发公司 中金软件开发 加班 网络安全校企合作的好处 航天通信属于网络安全吗 供应链中的数据库技术 组织员工学习网络安全法 大连网络安全工程师培训 信息网络技术与组织变革 网络安全的工作目标包括什么 mssql怎么获取所有数据库 战地5连接不到服务器怎么回事 微软内置网络安全产品
0