赋值运算符不调用参数化构造函数,而代码中存在复制构造函数

Assignment operator is not calling parameterized constructor while copy constructor present in code

案例 1: 当我使用赋值运算符创建 class 的对象时,如果代码中没有复制构造函数,它会调用参数化构造函数。

以下代码没有复制构造函数:

class Test{
    public:
    int a;
    Test(int a){
        this->a = a;
    }
};
int main(){
    Test x = 6;
    cout<<x.a;
    return 0;
}

案例 2: 但是,如果 class 中存在复制构造函数,那么如果我在声明 class 对象时使用赋值运算符,则会出错。

错误:无法将“Test&”类型的非常量左值引用绑定到“Test”类型的右值

以下代码带有复制构造函数

class Test{
    public:
    int a;
    Test(int a){
        this->a = a;
    }
    Test(Test &b){
       this->a = b.a;
    }

};
int main(){
    Test x = 6;
    cout<<x.a;
    return 0;
}

我的问题是复制构造函数的存在如何导致结果以错误结束? .由于存在复制构造函数,当我将参数分配给 class.

的对象时,我的程序也应该调用 Parameterize 构造函数

我认为:

Test(Test &b){
   this->a = b.a;
}

实际上应该是这样的:

Test(Test const &b){
   this->a = b.a;
}

复制构造函数应该得到一个const引用,并且他们应该将参数内容复制到当前对象内容中,而不是相反..

我推荐这个Question 因为解释了const和non-const变量。 是因为解释这个错误:

Error : cannot bind non-const lvalue reference of type ‘Test&’ to an rvalue of type ‘Test’

C++ 允许这样做,因为它是初始化:

int main(){
    Test x=6;//initialization "const Test& obj = 6" OK
}

但是 C++ 不允许这样(非常量值):

int main(){
    Test x=6;//initialization "Test& obj = 6" Not Ok!
}