我的理解是,如果我有一个班级
class MyClass {
public:
MyClass();
void SetVal( int );
private:
int val_;
}
我可以引用一个成员
MyClass::SetVal( int val ) { val_ = val }
MyClass::SetVal( int val ) { MyClass::val_ = val }
MyClass::SetVal( int val ) { this->val_ = val }
我喜欢指出变量是类成员的想法。 第二种和第三种方法之间有什么区别吗?
编辑:将SetVal(int)设为公开。写下这个例子是草率的。谢谢你指出
答案 0 :(得分:3)
(大概在现实生活中你标记SetVal
public
或protected
。)
在你的特定情况下绝对没有区别,尽管我val_ = val
充满了它,因为它是最清晰的。请注意,this->
是重言式。
请注意,您可以使用MyClass::val_
表示法来区分具有同名类成员的基类和子类 shadowed 的类成员。
答案 1 :(得分:3)
实际上有区别!......它是一个name lookup的东西
此,
MyClass::SetVal( int val ) { val_ = val }
执行unqualified name lookup。首先在类范围内首先搜索val_
,如果找不到, name-lookup 将继续搜索全局 namespace
以查找val_
。 example here
此,
MyClass::SetVal( int val ) { MyClass::val_ = val }
执行qualified name lookup。其中val_
严格限于class namespace。所以如果你没有这样的成员val_
,它就不会进一步搜索全局命名空间。另一个example here
此,
MyClass::SetVal( int val ) { this->val_ = val }
类似于第二个。 example here
答案 2 :(得分:0)
Layer
这用于'静态' (未在您的示例中使用)。静态对于类的所有实例都是通用的。说实话,使用propper声明ClassName :: isn不需要,但仍然可以接受。
MyClass::SetVal( int val ) { MyClass::val_ = val }
你可以使用它来访问实例字段val_,尽管单词' this'不是必需的