欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]解决C++“在构造函数中调用构造函数”的问题

[原创]解决C++“在构造函数中调用构造函数”的问题

函数的重用可以大大减少代码量,但是C++构造函数比较特别,“在构造函数中调用构造函数”常常被认为是不可行的,今天花了几个小时解决了这个问题。
下面分析问题来由:
#include <iostream>
using namespace std;
class CNestedConst
{
public:
       int m_iData;
     CNestedConst(int iData): m_iData(iData) {}
       CNestedConst() { //无参数的构造函数
       CNestedConst(0); //调用另一构造函数,用0初始化m_iData
     };
     ~ CNestedConst(){//这个析构函数主要是用来debug
       cout<<"对象地址:"<<this<<endl;
         cout<<"成员变量值:"<<this->m_iData<<endl;
     }
};
int main()
{
       CNestedConst ncTest; //调用CNestedConst()
       cout<<"ncTest.m_iData="<<ncTest.m_iData<<endl ;  //按照设计者的意图,这里应该输出 0 。
       return 0;
}
运行结果:
 
从图中可以看出cout<<"ncTest.m_iData="<<ncTest.m_iData<<endl ;这句代码输出结果是
ncTest.m_iData=-858993460,而析构函数调用了两次,也就是说产生了两个对象。
所以代码段
 CNestedConst() { //无参数的构造函数
 CNestedConst(0); //调用另一构造函数,用0初始化m_iData   };
达不到期望的作用,CNestedConst(0);只是创建了一个临时对象,在CNestedConst()结束后,该对象便析构了,m_iData仍未被赋值。
于是有人断言:不能在构造函数中调用构造函数。
解决这个问题的关键是不能让CNestedConst(0); 产生新对象。
于是很自然的,想到使用this 来调用该函数,写出如下代码
CNestedConst() { //无参数的构造函数
       this->CNestedConst(0); //调用另一构造函数,用0初始化m_iData
     };
一编译,错误又来了VC提示“illegal as right side of '->' operator”
VC把函数名CNestedConst 当做类名了。
遂加上CNestedConst:: 修饰符,以表明这是个函数。
完整代码如下:
#include <iostream>
using namespace std;
class CNestedConst{
public:
       int m_iData;
     CNestedConst(int iData): m_iData(iData) {}
       CNestedConst() { //无参数的构造函数
       this->CNestedConst::CNestedConst(0); //调用另一构造函数,用0初始化m_iData
     };
     ~ CNestedConst(){
       cout<<"对象地址:"<<this<<endl;
         cout<<"成员变量值:"<<this->m_iData<<endl;
     }
};
int main(){
       CNestedConst ncTest; //调用CNestedConst()
       cout<<"ncTest.m_iData="<<ncTest.m_iData<<endl ;  
       return 0;
}
运行结果: 
可见,预期的目的达到了,只产生了一个有效对象。

上传的附件 c++NestedConst-2.JPG
c++NestedConst-1.JPG

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功