按照这个answer,为成员变量和构造函数参数使用相同的名称是可以的。因此,在进行了一些调试之后,我发现了以下代码为何不起作用的原因(该类的操作成员从未初始化过,从而导致switch语句失败)。
#include <cstdio>
#include <cstdlib>
enum class Operator {
Add,
Subtract,
Multiply,
Divide
};
class Calculator {
Operator operation;
public:
Calculator(Operator operation) {
operation = operation;
}
int calculate(int a, int b) {
switch (operation) {
case Operator::Add: {
return a+b;
}
case Operator::Subtract: {
return abs(a-b);
}
case Operator::Multiply: {
return a*b;
}
case Operator::Divide: {
return a/b;
}
}
}
};
int main() {
Calculator calculator{Operator::Add};
int a = 100;
int b = 20;
printf("%d + %d = %d\n", a, b, calculator.calculate(a, b));
}
用构造函数内部的
operation = operation
替换operation{operation}
行解决了该问题,但是我仍然不明白为什么operation = operation
与operation{operation}
相比产生错误的结果,并且在构造函数初始化的上下文中两者之间有什么区别; 最佳答案
在两个标识符相同的特殊情况下,赋值和成员初始化之间的区别:operation = operation;
是从参数operation
到参数operation
的赋值。参数operation
使成员operation
黯然失色。
要解决此问题,您必须编写this->operation = operation;
。
class Calculator {
Operator operation;
public:
Calculator(Operator operation) {
this->operation = operation;
}
};
除此之外,成员初始化
operation(operation)
或operation{operation}
是可取的。class Calculator {
Operator operation;
public:
Calculator(Operator operation):
operation{operation}
{
}
};
之所以可行,是因为在成员初始化列表中,作用域还没有包含参数列表(类作用域),但是成员初始化器中的表达式在作用域中使用参数(成员函数作用域)进行了解析。
经过草率的解释后,我从
cppreference.com
撤回了Constructors and member initializer lists:即用于初始化
被考虑但不考虑参数(具有任何名称)。
在成员初始化器(括号或花括号)内,使用成员函数的常用名称解析,因此,参数可能会使具有相同名称的成员黯然失色。
关于c++ - 在使用相同名称的构造函数参数初始化成员变量时,=和{}之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61038148/