构造函数的显式调用

本文探讨了C++中构造函数显式调用的问题,分析了一段代码中出现的不确定性原因,并给出了避免此类问题的方法建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为在我的程序中碰到了问题,即我需要先定义对象,然后才能给出这个对象的一些实际参数,希望能够先定义出来,再用构造函数来初始化,然而不太可能,只能如下文所讲建一个Init函数。

 

 

转自:http://www.cnblogs.com/xkfz007/archive/2012/05/11/2496447.html

下面讨论一个重要问题是:构造函数的显式调用

 

大家看看下面这段代码的输出结果是什么?这段代码有问题么?

 

复制代码
    #include <iostream>  
     class CTest  
    {
     public:
        CTest()  
        {  
            m_a =  1;  
        }  
        CTest( int b)  
        {  
            m_b = b;  
            CTest();  
        }  
        ~CTest()  
        {}  
         void show  
        {  
            std::cout << m_a << std::endl;  
            std::cout << m_b << std::endl;  
        }  
      private:  
         int m_a;  
         int m_b;  
    }; 
    void main()  
    {  
        CTest myTest( 2);  
        myTest.show();  
    }
复制代码

-----------------------------------------------------------

【分析】
-----------------------------------------------------------

输出结果中,m_a是一个不确定的值,因为没有被赋初值,m_b 为2

注意下面这段代码
CTest(int b)
{
    m_b = b;
    CTest();
}
在调用CTest()函数时,实际上是创建了一个匿名的临时CTest类对象,CTest()中赋值 m_a = 1 也是对该匿名对象赋值,故我们定义的myTest的m_a其实没有被赋值。说白了,其实构造函数并不像普通函数那样进行一段处理,而是创建了一个对象,并 且对该对象赋初值,所以显式调用构造函数无法实现给私有成员赋值的目的。

 这个例子告诉我们以后代码中千万不要出现使用一个构造函数显式调用另外一个构造函数,这样会出现不确定性。其实一些初始化的代码可以写在一个单独的init函数中,然后每一个构造函数都调用一下该初始化函数就行了。

    在此,顺便再提出另外一个问题以供思考:

复制代码
    CTest *p = NULL;  
     void func()  
    {     
        p =  new CTest();  
    }
复制代码

 

 代码右边显示调用CTest(),是否依然会产生一个匿名的临时对象a,然后将该匿名的临时对象a的地址赋给指针p? 如果是这样的话,出了func函数后,临时对象a是否会被析构? 那指针p不成为了野指针了?你能解释这个问题么?

答:我实验的结果是不会产生临时对象a,直接将产生的对象指针赋给了p

参考:http://ticktick.blog.51cto.com/823160/294573

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值