构造函数的显式调用
来源:互联网 发布:双色球算法公式 编辑:程序博客网 时间:2024/04/26 08:07
因为在我的程序中碰到了问题,即我需要先定义对象,然后才能给出这个对象的一些实际参数,希望能够先定义出来,再用构造函数来初始化,然而不太可能,只能如下文所讲建一个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();
}
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();
}
void func()
{
p = new CTest();
}
代码右边显示调用CTest(),是否依然会产生一个匿名的临时对象a,然后将该匿名的临时对象a的地址赋给指针p? 如果是这样的话,出了func函数后,临时对象a是否会被析构? 那指针p不成为了野指针了?你能解释这个问题么?
答:我实验的结果是不会产生临时对象a,直接将产生的对象指针赋给了p
参考:http://ticktick.blog.51cto.com/823160/294573
- 构造函数的显式调用
- 显式调用构造函数
- 显式调用构造函数
- 构造函数的调用
- 构造函数的调用
- 构造函数的调用
- 构造函数的调用
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- C++构造函数详解及显式调用构造函数
- c++构造函数详解及显式调用构造函数
- Android应用程序开发以及背后的设计思想深度剖析(3)
- 无锁队列
- 有胆你就来!11个在线编码大赛
- Android应用程序开发以及背后的设计思想深度剖析(4)
- 搞笑的话
- 构造函数的显式调用
- json解析小例
- C/C++中指针和引用之相关问题研究
- editor does not contain a main type
- Android应用程序开发以及背后的设计思想深度剖析(5)
- 训狗
- 【C语言】什么是C语言?
- tab与blank
- Android深入浅出之Audio