如何免费建造网站,新网站推广,一台vps可以做几个网站,wordpress always主题昨天一个同学让我帮他调试程序#xff0c;发现一个诡异的问题#xff0c;明明一个类的私有成员被赋值了#xff0c;但运行时却总是不定的值。仔细检查了好久#xff0c;才发现原来他把构造函数当作普通函数进行了显式调用#xff0c;结果产生了悲剧。将他的问题简单的抽象…昨天一个同学让我帮他调试程序发现一个诡异的问题明明一个类的私有成员被赋值了但运行时却总是不定的值。仔细检查了好久才发现原来他把构造函数当作普通函数进行了显式调用结果产生了悲剧。 将他的问题简单的抽象如下 大家看看下面这段代码的输出结果是什么这段代码有问题么#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不成为了野指针了你能解释这个问题么 关于c构造函数的详细分类与示例在《C构造函数详解》一文中有详细的描述有兴趣的读者可以看看:http://ticktick.blog.51cto.com/823160/194307