C++ 为构造函数参数使用相同名称初始化成员变量时,=和{}之间的差异

C++ 为构造函数参数使用相同名称初始化成员变量时,=和{}之间的差异,c++,constructor,initialization,C++,Constructor,Initialization,因此,对成员变量和构造函数参数使用相同的名称是可以的。因此,在进行了一些调试之后,我明白了为什么下面的代码不起作用(类的操作成员从未初始化,导致switch语句失败) #包括 #包括 枚举类运算符{ 添加 减去, 乘, 分 }; 类计算器{ 操作员操作; 公众: 计算器(操作员操作){ 操作=操作; } 整数计算(整数a,整数b){ 开关(操作){ 案例运算符::添加:{ 返回a+b; } 大小写运算符::减法:{ 返回abs(a-b); } 大小写运算符::乘法:{ 返回a*b; } case

因此,对成员变量和构造函数参数使用相同的名称是可以的。因此,在进行了一些调试之后,我明白了为什么下面的代码不起作用(类的操作成员从未初始化,导致switch语句失败)

#包括
#包括
枚举类运算符{
添加
减去,
乘,
分
};
类计算器{
操作员操作;
公众:
计算器(操作员操作){
操作=操作;
}
整数计算(整数a,整数b){
开关(操作){
案例运算符::添加:{
返回a+b;
}
大小写运算符::减法:{
返回abs(a-b);
}
大小写运算符::乘法:{
返回a*b;
}
case操作符::Divide:{
返回a/b;
}
}
}
};
int main(){
计算器{运算符::加法};
INTA=100;
int b=20;
printf(“%d+%d=%d\n”,a,b,calculator.calculation(a,b));
}

用构造函数内部的
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}
更可取

class Calculator {
    Operator operation;
    public:
        Calculator(Operator operation):
          operation{operation}
        {
        }
};
这是因为,在成员初始化列表中,作用域(尚未)包含参数列表(类作用域),但成员初始值设定项中的表达式在具有参数的作用域(成员函数作用域)中解析


在我草率的解释之后,我从
cppreference.com
回忆起:

在复合语句的大括号之前,任何构造函数的函数定义的主体可能包括成员初始值设定项列表,其语法为冒号字符,后跟一个或多个成员初始值设定项的逗号分隔列表,每个成员初始值设定项具有以下语法


类或标识符表达式列表(可选)(1)


类或标识符括号初始化列表(2)(从C++11开始)


参数包(3)(从C++11开始)


1) 使用直接初始化或(如果表达式列表为空)值初始化按类或标识符命名的基或成员

2) 使用列表初始化初始化按类或标识符命名的基或成员(如果列表为空,则为值初始化;初始化聚合时为聚合初始化)

3) 使用包扩展初始化多个基

  • 类或标识符—命名非静态数据成员、直接基或虚拟基或(对于委托构造函数)类本身的任何标识符、类名或decltype表达式

  • 表达式列表-可能是空的,以逗号分隔的参数列表,传递给基或成员的构造函数

  • 大括号初始列表-逗号分隔初始值设定项和嵌套大括号初始列表的大括号封闭列表

  • 参数包-可变模板参数包的名称

例如,对于初始值设定者

  • 仅类标识符本身(用于委托构造函数调用)
  • 基类标识符(用于基类构造函数调用)
  • 和数据成员(对于成员初始值设定项)
被认为是参数,但不是参数(具有任何名称)


在成员初始值设定项(圆括号或大括号)内,成员函数的通常名称解析适用,因此,参数可能会使具有相同名称的成员黯然失色。

不能将
operation=operation
替换为
operation{operation}
。“那将是不正确的。”米克利也许有点措词混乱。我相信我理解了它的含义:在构造函数(初始值设定项列表)中使用操作{operation}。
class Calculator {
    Operator operation;
    public:
        Calculator(Operator operation):
          operation{operation}
        {
        }
};