2013-05-10 73 views
0

当定义一个类cls时,在cls的自定义中使用它们时,是否有必要(或好的做法)将类名称cls::加到成员的前面,还是隐式完成?例如。类的成员是否需要在类定义中加入`class ::`的前缀?

class cls { 
    int x; 
    void foo(); 
    void bar(); 
} 
void cls::foo() { 
    x++; // or use cls::x? 
    bar(); // or cls::bar()? 
} 

如果是这样,那么就创建一个类cls自动意味着它也是一个命名空间(因为我以为::运营商只与命名空间中使用)?

编辑(跟进): 如果我们不使用cls::this->,那么如果我的消息人士还具有可变x外班? cls::foo()怎么知道哪一个x++指的是?

+1

在'x'等成员变量的名称前加上'm_'(即'm_x')通常是比较常见的。这有助于将局部变量与类成员区分开来,从而消除了为什么您可能希望以类名 – 2013-05-10 13:20:14

回答

1

你看上面的代码定义一类,但最初只声明成员函数(然后定义他们只是事后)。我只提到这一点,因为术语对有效沟通很重要。

如果你定义的类成员在线,那么你不使用范围解析操作::,例如:

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 
} 
1

Nop。至少不会那样。

您可以使用this->使读者更清楚。但是::是不同的事情。它用于访问静态成员变量或函数。

int x;     // Global x 
namespace ot { int x; } // another x 
class cls { 
    int x;    // Normal member 
    static int y;  // Static member 
    void foo(); 
    static void bar(); // Static member function 
} 
void cls::foo() { 
    this->x++; // Modify own x. 
    x++   // Modify own x. This has implicit this-> 
    ::x++;  // Modify the global x. 
    ot::x++;  // Modify the x in namespace ot. 
    cls::y++;  // modify the static member 
    cls::bar(); // static member function. same as bar() 
} 
+0

来确定成员范围的一个原因。那么,如果我的源在类之外还有一个变量'x',该怎么办呢?如果我们不使用'this',cls :: foo()如何知道'x ++'指的是哪一个? – mchen 2013-05-10 13:13:07

+0

'::'_can_可与非静态数据和函数成员一起使用,并可用于禁用虚拟分派。 – 2013-05-10 13:13:56

+0

@MiloChen它将始终使用该类自己的x。查看编辑 – stardust 2013-05-10 13:15:10

2

明确限定成员变量的使用与类名是一个坏主意。充其量,这是没有必要的(或者在必要时,this-> member更好),并禁止重构(如果您重命名类,则更多地方需要更改),最坏的情况是它会引入错误,因为对虚拟函数的限定调用不会调度为重载版本。

相关问题