尝试按值将对象传递给 C++ 中的构造函数

Trying to pass object by value to constructor in C++

所以我一直在尝试制作一个测试程序来显示按引用传递对象和按值传递对象之间的区别。

我希望 ClassB 的构造函数接受两个参数:对 ClassA 的引用和 ClassA 的值。

当构造函数只接受引用时,我已经能够 运行 程序。但是,当我添加第二个参数(对于 ClassA 的值)时,出现错误 "no matching function for call to 'ClassA::ClassA()'".

#include <iostream>
using namespace std;

class ClassA{
    int num;

public:
    ClassA(int _num){
        num = _num;
    }

    int getNum(void){
        return num;
    }

    void addToNum(int value){
        num += value;
    }
};

class ClassB {
    ClassA * classPointer;
    ClassA classValue;

public:
    ClassB(ClassA& referencedClass, ClassA value){ // HERE I get the error
        classPointer = &referencedClass;
        classValue = value;
    }

    int getPointedNum(void){
        return classPointer->getNum();
    }

    int getValueNum(void){
        return classValue.getNum();
    }
};

int main(int argc, char *argv[]) {

    ClassA classA (20);
    ClassB classB (classA, classA);
    classA.addToNum(5);
    cout << "classB.getPointedNum(): " << classB.getPointedNum() << endl;
    cout << "classB.getValueNum(): " << classB.getValueNum() << endl;


    return 0;
}

有人知道这里发生了什么吗?

谢谢。

您需要通过调用其构造函数显式初始化 classValue,因为您通过定义非默认构造函数删除了其默认构造函数。

这必须在构造函数的member initialization list中完成,因为成员变量在进入构造函数体之前被初始化:

ClassB(ClassA& referencedClass, ClassA value)
: classPointer(&referencedClass), classValue(value) // member initialization list
{
    // constructor body
}

这将使用值 &referencedClass 初始化 classPointer 并使用 value.

调用 ClassA 的默认复制构造函数

您看到的错误对应于成员 classValue 缺少初始值设定项。

当你使用

ClassB(ClassA& referencedClass, ClassA value) { ... }

编译器尝试使用默认构造函数初始化 classValue。由于没有,因此无法初始化 classValue.

您可以使用:

ClassB(ClassA& referencedClass, ClassA value) :
    classPointer(&referencedClass_,
    classValue(value)
{
}