c++ - 当变量初始化与未初始化时,C++ 中参数化构造函数的工作
问题描述
下面的 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
构造函数可以使用两个、一个或零个参数来调用。如果不使用任何参数,则将使用默认值。
但是如果你删除了默认值,你就不再有一个默认构造函数,一个可以不带参数使用的构造函数。
它实际上与具有默认参数值的普通函数完全相同......
假设你有这个功能:
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
推荐阅读
- python - 如何使用字典理解计算键子字符串匹配的字典值小计
- c++ - CppCoreGuidelines:什么是热 int 副本?
- javascript - 如何获得输入键来模拟按钮按下?
- laravel - 多态关系中的 where 子句
- r - Flexdashboards:用于创建表格/图表的原始数据框是否安全?
- java - 在 Graphviz 中仅绘制达到一定长度的路径
- mysql - MySQL查询性能在不同目录中的同一台服务器上下降
- java - Java Lambda:通过稍后的设置器设置特定字段,使用对象中的键字段
- html - 当列表也有href时,如何使文本更大?
- xslt - 根据属性值过滤 XML