我有以下代码:
#include <iostream>
class TestClass {
private:
int var1, var2;
public:
TestClass()
:var1(0), var2(0)
{}
TestClass(int x)
{
std::cout << "\nOne argument constructor\n";
}
void showData()
{
std::cout << "var1 = " << var1 << std::endl;
std::cout << "var2 = " << var2 << std::endl;
}
};
int main()
{
TestClass obj;
obj.showData();
obj = 3;
obj.showData();
return 0;
}
输出:
我的问题:
1-为什么我可以在未声明对象的语句中调用一个参数构造函数? 2-为什么在调用一个参数构造函数后 var1 和 var2 的值发生了变化?
我在VS社区版上运行了代码。
答案 0 :(得分:2)
未标记为explicit
的单参数构造函数可用于隐式转换序列。
在代码obj = 3;
中,可以通过将int
隐式转换为TestClass
来满足。您的一元构造函数可用于此目的;该代码的行为与obj = TestClass(3);
相同。
您的程序通过尝试显示未初始化的变量而导致未定义的行为。单参数构造函数应初始化var1
和var2
。
答案 1 :(得分:2)
在包括您本人在内的many cases中,编译器能够(除其他外)自动生成TestClass& operator=(const TestClass&)
形式的赋值运算符。由于TestClass
可从单个整数隐式构造,因此obj = 3
被解析为obj = TestClass(3)
。
这也解释了var1
和var2
更改的原因:编译器构造了一个TestClass
对象,使它们保持未初始化状态,然后将这些未初始化的值复制到您的对象中。如果您为var1
和var2
分配一个特定的值(例如1),则在分配副本后将获得该值。