Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 双冒号表示c++;_C++ - Fatal编程技术网

C++ 双冒号表示c++;

C++ 双冒号表示c++;,c++,C++,我一直觉得:是用来访问静态成员的。然而,我惊讶地发现,下面的编译非常好。(我会使用this->,如内联注释所示。) 对Google/StackOverflow的进一步调查并没有显示任何与此行为相关的信息,我想知道是否有人能对此有所了解 class Test { private: int x; public: void set_x(int x) { // this->x = x; Test::x = x; } }

我一直觉得
是用来访问静态成员的。然而,我惊讶地发现,下面的编译非常好。(我会使用
this->
,如内联注释所示。)

对Google/StackOverflow的进一步调查并没有显示任何与此行为相关的信息,我想知道是否有人能对此有所了解

class Test {
    private:
        int x;
    public:
    void set_x(int x) {
        // this->x = x;
        Test::x = x;
    }
};

int main(int argc, char *argv[])
{
    return 0;
}
ENV:clangversion7.0.0-(主干)

如果限定id的嵌套名称说明符指定类,则名称 在的范围内查找嵌套名称说明符后指定 类([class.member.lookup]),下面列出的情况除外。名字 应代表该类别或其基础类别的一个或多个成员 类([class.derived])。[ 注意:可以使用 在其潜在作用域([basic.scope.class])中的任意点上的限定id- 结束 注 ]


是的,它只指定声明对象的类名/名称空间。可能有更多人为的情况,例如:

struct Base {
    virtual int answer() const { return 42; }
};

struct Left: public virtual Base {
    virtual int answer() const { return 314; } // raise the heat
};

struct Right: public virtual Base {
    virtual int answer() const { return -42; } // to the other side
};

struct Bottom: Left, Right {
    virtual int answer() const { return Base::answer(); } // back to basics
};

#include <iostream>
int main() {
    Bottom b;
    std::cout << b.answer() << std::endl;           // 42
    std::cout << b.Right::answer() << std::endl;    // -42
    std::cout << b.Left::answer() << std::endl;     // 314
    std::cout << b.Base::answer() << std::endl;     // again, 42
}
struct Base{
虚int answer()常量{return 42;}
};
结构左:公共虚拟基{
virtual int answer()常量{return 314;}//升高温度
};
结构权限:公共虚拟基{
虚拟int answer()常量{return-42;}//到另一端
};
结构底部:左、右{
virtual int answer()常量{return Base::answer();}//返回基础
};
#包括
int main(){
底部b;

std::cout该
是范围解析运算符,可用于指定引用引用的多个同名但不同但可见范围的符号中的哪一个


本例中可以使用范围解析或
this->
,但范围解析本身在语言中具有更广泛的适用性。

使用类名限定实例变量(或成员函数)有几个原因。此列表并非详尽无遗,仅提及我们将在对象实例上使用它的情况,而非类型:

  • 在成员函数内部,如果派生函数和父函数具有相同的成员名称,则派生名称会隐藏基函数。限定可以允许访问基函数。这适用于变量和成员函数

  • 如果在具有多重继承的层次结构中的成员函数中,它可以选择要使用的父函数

  • 它可以通过以指定的类型而不是最重写的类型调用函数实现来绕过虚拟函数分派机制。例如:
    d.Base::foo();

  • 它可以用来指定一个被局部变量隐藏的成员,类似于用->来限定一个成员(虽然我从来没有见过这样做,我更喜欢用->来代替)

  • 它经常与“using”声明结合使用,将基类函数名带入派生类的重载集中,该重载集中添加了一些具有相同名称的基类函数名。否则,基类函数名将被隐藏


请参见此处,这是对变量名的限定,如果基类和继承类的名称冲突-,这将非常有用。如果在类范围内,则完全可以使用未限定的静态成员。也可以对静态成员的对象使用成员访问运算符
这->
对于访问d的成员非常有用ependent base。在Java中,让构造函数的参数与成员同名,并编写
this->a=a
Yes,这也有点惯用。@路人,但还有其他方法吗?