你看上面的代码定义一类,但最初只声明成员函数(然后定义他们只是事后)。我只提到这一点,因为术语对有效沟通很重要。
如果你定义的类成员在线,那么你不使用范围解析操作::
,例如:
class cls {
void hello() { cout << "Hello world"; }
};
如果单独定义它们,那么你做需要它,否则编译器不能确切地知道你打算定义什么功能:
class cls {
void hello();
};
void cls::hello() { cout << "Hello world"; };
一般来说,范围解析运算符的使用为n不限于使用名称空间;只要需要向编译器提供标准名称,就可以使用它。
在大多数情况下从类作用域内访问类成员时,可以使用它们的非限定名称;编译器将自行解决它们。因此,例如,在代码中所有这些都是等价的:
x++;
cls::x++;
this->x++;
this->cls::x++; // yes, this too
您需要限定,只要有名称相同的多个成员的姓名和编译器解析不合格的名称比你预期的成员以外的东西。实例:
void cls::foo(int x) {
x++; // increments the argument
cls::x++; // increments the member
this->x++; // also increments the member
}
考虑也是cls
可以从base
派生,并且base
还可以限定一个x
。在这种情况下,它的工作原理是这样的:
void cls::foo() {
x++; // increments foo::x
cls::x++; // increments foo::x
base::x++; // increments base::x
}
来源
2013-05-10 13:12:59
Jon
在'x'等成员变量的名称前加上'm_'(即'm_x')通常是比较常见的。这有助于将局部变量与类成员区分开来,从而消除了为什么您可能希望以类名 – 2013-05-10 13:20:14