您上面显示的代码定义了一个类,但最初只声明成员函数(然后再定义它们)。我之所以提到这一点,是因为术语对于有效沟通很重要。
如果您内联定义类成员,则不使用范围解析运算符 ::
,例如:
class cls {
void hello() { cout << "Hello world"; }
};
如果您分别定义它们,那么您确实需要它,因为否则编译器无法确切知道您打算定义什么函数:
class cls {
void hello();
};
void cls::hello() { cout << "Hello world"; };
一般来说,作用域解析运算符的使用不限于使用命名空间;只要需要向编译器提供完全限定的名称,就可以使用它。
在大多数情况下从类范围内访问类成员时,您可以使用它们的非限定名称;编译器将自行解决它们。因此,例如,在您的代码中,所有这些都是等效的:
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
可能定义 a x
。在这种情况下,它的工作方式如下:
void cls::foo() {
x++; // increments foo::x
cls::x++; // increments foo::x
base::x++; // increments base::x
}