当变量初始化与未初始化时,C++ 中参数化构造函数的工作
Working of parameterized constructor in C++ when variables are initailized vs uninitialized
以下 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;
}
当参数化构造函数的变量r
和i
未初始化时(例如: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;
的一个问题。请原谅我的天真,但不清楚为什么它在初始代码片段本身中以这种方式工作。希望有人能澄清一下。
定义 Complex(int r=0, int i=0)
允许 0、1 或 2 个参数。 Complex c3;
正在用 0 个参数构造一个 Complex
。
您可以改用重载,例如
class Complex{
private:
int real, imag;
public:
Complex() : real(0), imag(0) {}
Complex(int r, int i) : real(r), imag(i) {}
};
请注意,在构造函数的主体中使用成员初始化器比使用赋值语句更好。
您显示的 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
以下 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;
}
当参数化构造函数的变量r
和i
未初始化时(例如: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;
的一个问题。请原谅我的天真,但不清楚为什么它在初始代码片段本身中以这种方式工作。希望有人能澄清一下。
定义 Complex(int r=0, int i=0)
允许 0、1 或 2 个参数。 Complex c3;
正在用 0 个参数构造一个 Complex
。
您可以改用重载,例如
class Complex{
private:
int real, imag;
public:
Complex() : real(0), imag(0) {}
Complex(int r, int i) : real(r), imag(i) {}
};
请注意,在构造函数的主体中使用成员初始化器比使用赋值语句更好。
您显示的 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