c++混淆是使用参数化构造函数还是复制构造函数

时间:2021-04-11 12:24:02

标签: c++ constructor copy-constructor

class sampleConstructor {
int x;

public:
//WE COULD DO OVERLOAD CONSTRUCTOR JUST LIKE IN FUNCTIONS | THEY ONLY DIFFERENTIATE IN NO. OF ARGUMENTS AND DATATYPE OF ARGUMENTS JUST LIKE IN FUNCTION
sampleConstructor () {  //THIS IS THE DEFAULT CONSTRUCTOR, THIS WILL AUTOMATICALLY INITIALIZE EVERYTHING TO 0 IF NOT EXPLICITLY STATED, THIS IS AUTOMATICALLY CREATED UNLESS EXPLICITLY STATED
    x = 0;
}
//sampleConstructor () { }; //IT COULD ALSO LOOK LIKE THIS
//IF YOU CREATED A PARAMETERIZED CONSTRUCTOR, DEFAULT CONSTRUCTOR WOULD NOT BE AUTOMATICALLY CREATED ANYMORE
sampleConstructor (int y) { //THIS IS A PARAMETERIZED CONSTRUCTOR
    x = y;
}
//COPY CONSTRUCTOR ARE PASSED BY REFERENCE AS TO AVOID INFINITE RECURSION
sampleConstructor (sampleConstructor &sampleCopy) { //THIS IS COPY CONSTRUCTOR, THIS IS AUTOMATICALLY CREATED UNLESS EXPLICITLY STATED | PURPOSE OF COPY CONSTRUCTOR IS TO COPY THE VALUE OF ANOTHER OBJECT
    x = sampleCopy.x;
}
void showData () {
    std::cout << "value of x is " << x << std::endl;
}
//IT IS NOT A GOOD PRACTICE TO CALL DESTRUCTOR EXPLICITLY
// ~sampleConstructor () { } ; //THIS IS DESTRUCTOR, IT IS AUTOMATICALLY CREATED BY THE COMPILER, IT MUST CONTAIN NO ARGUMENT, ONLY ONE DESTRUCTOR IS REQUIRED.
~sampleConstructor () {
    std::cout << "yes, sample constructor could also do this!" << std::endl;
}
};

int main () {
//EACH OBJECT CAN ONLY USE 1 TYPE OF CONSTRUCTOR
sampleConstructor obj1(50); //HERE WE USES PARAMETERIZED CONSTRUCTOR
sampleConstructor obj4 =sampleConstructor(50); //OBJECT CAN ALSO BE INITIALIZED LIKE THIS

sampleConstructor obj2(obj1); //HERE WE USES COPY CONSTRUCTOR, WE COPY THE VALUE OF obj1 INTO obj2
sampleConstructor obj3 = obj1; //COPY CONSTRUCTOR CAN ALSO BE INITIALIZED LIKE THIS
obj1.showData();
obj2.showData();
obj3.showData();
return (0);
}

obj4 产生一个错误,很困惑是使用参数化构造函数还是复制构造函数,但是当我像这样初始化它时:sampleConstructor obj4(20),它完美地工作。 sampleConstructor obj4 = sampleConstructor(20) 和 sampleConstructor obj4(20) 是一样的吧?

1 个答案:

答案 0 :(得分:4)

复制构造函数的参数需要是const引用:

sampleConstructor(const sampleConstructor &sampleCopy)

非常量(左值)引用不能绑定到右值,而 sampleConstructor(50) 是一个右值。

请注意,您的代码从 C++17 开始就有效,这要求 sampleConstructor obj4 =sampleConstructor(50);sampleConstructor obj4(50); 完全等效。在这种情况下,C++17 之前的编译器被允许不发出复制(或移动)构造函数调用,但复制(或移动)构造函数本身必须可用,即使编译器决定不使用它.

相关问题