一个参数构造函数如何工作?

时间:2018-07-14 07:02:17

标签: c++

我有以下代码:

#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;
}

输出:

output


我的问题:

1-为什么我可以在未声明对象的语句中调用一个参数构造函数? 2-为什么在调用一个参数构造函数后 var1 var2 的值发生了变化?


我在VS社区版上运行了代码。

2 个答案:

答案 0 :(得分:2)

未标记为explicit的单参数构造函数可用于隐式转换序列。

在代码obj = 3;中,可以通过将int隐式转换为TestClass来满足。您的一元构造函数可用于此目的;该代码的行为与obj = TestClass(3);相同。

您的程序通过尝试显示未初始化的变量而导致未定义的行为。单参数构造函数应初始化var1var2

答案 1 :(得分:2)

在包括您本人在内的many cases中,编译器能够(除其他外)自动生成TestClass& operator=(const TestClass&)形式的赋值运算符。由于TestClass可从单个整数隐式构造,因此obj = 3被解析为obj = TestClass(3)

这也解释了var1var2更改的原因:编译器构造了一个TestClass对象,使它们保持未初始化状态,然后将这些未初始化的值复制到您的对象中。如果您为var1var2分配一个特定的值(例如1),则在分配副本后将获得该值。