0

下面的 C++ 代码有效。

#include<iostream>
using namespace std;

class Complex{
private:
    int real, imag;
public:
    Complex(int r=0, int i=0){
        real = r;      imag = i;
    }
};


int main()
{
    Complex c1(10, 5), c2(2, 4);
    Complex c3;
}

当参数化构造函数的变量ri未初始化时(例如:)Complex(int r, int i),编译器会抛出错误

main.cpp:19:13: 错误:没有匹配函数调用'Complex::Complex()' 19 | 复合物c3;| ^~ main.cpp:10:5: 注意:候选:'Complex::Complex(int, int)' 10 | 复杂(int r,int i){ | ^~~~~~~。

我理解这是声明的一个问题Complex c3;。请原谅我的幼稚,但尚不清楚为什么它在初始代码片段本身中以这种方式工作。希望有人能澄清这一点。

4

2 回答 2

2

您显示的带有默认参数的Complex构造函数可以使用两个、一个或零个参数来调用。如果不使用任何参数,则将使用默认值。

但是如果你删除了默认值,你就不再有一个默认构造函数,一个可以不带参数使用的构造函数。


它实际上与具有默认参数值的普通函数完全相同......

假设你有这个功能:

void foo(int arg = 0)
{
    // Implementation is irrelevant
}

现在这可以称为:

foo(123);  // Pass an explicit argument

或者作为:

foo();  // Equivalent to foo(0)

如果删除默认值:

void foo(int arg)
{
    // Implementation is irrelevant
}

然后不带任何参数调用函数是错误的:

foo();  // Error: Argument expected
于 2021-10-07T10:13:40.003 回答
1

该定义Complex(int r=0, int i=0)允许 0、1 或 2 个参数。Complex c3;正在构造Complex带有 0 个参数的 a。

你可以改为重载,例如

class Complex{
private:
    int real, imag;
public:
    Complex() : real(0), imag(0) {}
    Complex(int r, int i) : real(r), imag(i) {}
};

请注意,在构造函数的主体中使用成员初始化器比使用赋值语句更好。

于 2021-10-07T10:12:48.713 回答