千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关如何进行C++拷贝构造函数深入分析以及重写operator ,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。class C
千家信息网最后更新 2026年11月03日如何进行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模板 亿人帮互联网科技 互联网科技有限公司 翻译 衡水科技产业互联网平台 互联网金融科技公司干啥的 厦门比较好的科技互联网公司 荆州市昕露互联网络科技有限公司 互联网科技数字货币 南京一网一红互联网科技有限公司 世界互联网科技成果奖 北京天晋互联网科技有限公司 互联网领先科技成果宣传视频 恒生互联网科技趋势 互联网科技垄断 上海挚品互联网科技 百单互联网科技有限公司 中盈科技互联网信息有限公司 随着互联网科技发展 广州市恰铎互联网科技有限公司 互联网科技大奖都有哪些公司 阿里互联网科技企业 上海京穆互联网科技有限公司 山东大美朱楼互联网科技有限公司
0