我是说,我们不能这样做:
class A {
int i;
char c;
public:
A(int i = 0, char c = ' ') : this->i(i), this->c(c) {}
};是因为实例还没有创建,还是类似的原因?
发布于 2015-04-27 09:10:01
您不需要在初始化器列表中使用this关键字,因为初始化器列表中的任何内容都必须在类中声明。当你这样做的时候
class MyClass
{
int member;
public:
MyClass(int member) : member(member) { }
^^^^^ Can only be resolved to a member of MyClass
}不允许初始值设定项列表中的member引用类中除int member以外的任何内容。因此,如果编译器必须在初始化器列表中同时支持member(member)和this->member(member),则this关键字是不必要的,并且会增加额外的解析难度。同时给人一种可以同时初始化初始化器列表内的非成员变量的印象。
发布于 2015-04-27 09:08:41
如果查看overview of the C++ grammar,特别是mem-initializer-list部分,您会看到初始化器列表应该由identifier(expression)或classname(expression)条目组成。identifier被定义为数字和非数字(a-z,A-Z,_)组成的字符串。
您的this->identifier(expression)与此不匹配,因此不允许使用。无论如何,这是没有必要的,因为这里没有歧义。identifier始终是类的成员变量,因此很清楚引用哪个i。
class A {
int i;
char c;
public:
A(int i = 0, char c = ' ') : i(i), c(c) {}
};发布于 2015-04-27 09:02:41
您不需要像这样使用this:
class A {
int i;
char c;
public:
A(int i = 0, char c = ' ') : i(i), c(c) {} // syntax makes this good
};这完全没问题,并且完全按照你想要的方式工作。
语法规则意味着参数不能作为被初始化的变量出现,只能作为它的参数出现。因此,编译器必须将括号i()之外的变量解析为类成员,而将括号(i)内的变量从参数中解析出来,因为由于作用域规则的原因,它们隐藏了成员变量。
A(int i = 0): i(i) {}
^ - syntax says that i must be a member
A(int i = 0): i(i) {}
^ - syntax says normal scoping rules apply在括号之外,它必须是一个类成员,但在括号内,作用域规则类似于构造函数体-参数隐藏了成员变量。
因此,使用该模式将参数命名为与数据成员相同的名称是非常安全的。
https://stackoverflow.com/questions/29885552
复制相似问题