C++ 使用范围运算符访问非静态成员变量

C++ 使用范围运算符访问非静态成员变量,c++,scope,C++,Scope,事实上,您可以使用以下语法显式访问成员变量(在成员函数内部,尤其是构造函数内部):this->member\u name(即,与同名函数参数区分) 除此之外,我还认为语法ClassName::static_member是为访问类外的静态成员而保留的 然后,当我意识到下面的set_2()方法正在按预期工作时,我感到惊讶: #include <iostream> struct A { int x; // The two following methods seem to

事实上,您可以使用以下语法显式访问成员变量(在成员函数内部,尤其是构造函数内部):
this->member\u name
(即,与同名函数参数区分)

除此之外,我还认为语法
ClassName::static_member
是为访问类外的静态成员而保留的

然后,当我意识到下面的
set_2()
方法正在按预期工作时,我感到惊讶:

#include <iostream>

struct A {
    int x;
    // The two following methods seem to act similarly:
    void set_1(int x) { this->x = x; }
    void set_2(int x) { A::x = x; }
};

int main ()
{
    A a;

    a.set_1(13);
    std::cout << a.x << std::endl;

    a.set_2(17);
    std::cout << a.x << std::endl;

    return 0;
}
#包括
结构A{
int x;
//以下两种方法的作用似乎相似:
无效集_1(int x){this->x=x;}
空集_2(int x){A::x=x;}
};
int main()
{
A A;
a、 第1组(13);

Std::Cuth:P> <代码:A::X<代码>,在您的情况下,仍然引用您的常规成员变量;它只是明确地指定了哪个代码< x >代码>。考虑一个类,它来自两个具有相同名称的成员(不是很好的编码风格)的类:


<代码>::x<代码>,在您的情况下,仍然引用您的常规成员变量;它只是明确地指定了哪个“<代码> x <代码> >。考虑一个类,它来自两个具有相同名称的成员(不是很好的编码风格)的类:


在本例中使用
A::x
是有效的,但我认为
this->x
更惯用,更不容易出错(代码的读者可以立即看到
x
是类的一员,而不必考虑
A
是什么)“< /p> < p>使用此代码>:::x<代码>在这种情况下是有效的,但我认为<>代码> -> x/Cuth>更习惯,而且不易出错(代码的读者可以立即看到 X/Cuth>是类的成员,而不考虑什么是<代码> A/COD>)。

< P>根据C++标准(3.3.7类范围)

2类成员的名称只能在以下情况下使用:

-在其类(如上所述)或派生类的范围内 (第10条)从其类别

-在.运算符应用于其类型的表达式之后 类别(5.2.5)或从其类别派生的类别

-在->运算符应用于指向其类的对象的指针之后 (5.2.5)或从其类别派生的类别

-将::scope解析运算符(5.1)应用于 它的类或从它的类派生的类

例如,派生类的方法的数据成员可以隐藏其基类的数据成员和/或方法。要访问基类的数据成员和方法,可以使用范围解析运算符

struct Base
{
    virtual ~Base() {};
    virtual void Hello() const { std::cout << "Base" << std::endl; }
};


struct Derived : Base
{
    virtual void Hello() const 
    { 
        Base::Hello();
        std::cout << "and Derived" << std::endl; 
    }
};

Derived d;

d.Hello();
struct Base
{
虚~Base(){};

CONST{STD::CUT< P>根据C++标准(3.3.7类范围)

2类成员的名称只能在以下情况下使用:

-在其类(如上所述)或派生类的范围内 (第10条)从其类别

-在.运算符应用于其类型的表达式之后 类别(5.2.5)或从其类别派生的类别

-在->运算符应用于指向其类的对象的指针之后 (5.2.5)或从其类别派生的类别

-将::scope解析运算符(5.1)应用于 它的类或从它的类派生的类

例如,派生类的方法的数据成员可以隐藏其基类的数据成员和/或方法。要访问基类的数据成员和方法,可以使用范围解析运算符

struct Base
{
    virtual ~Base() {};
    virtual void Hello() const { std::cout << "Base" << std::endl; }
};


struct Derived : Base
{
    virtual void Hello() const 
    { 
        Base::Hello();
        std::cout << "and Derived" << std::endl; 
    }
};

Derived d;

d.Hello();
struct Base
{
虚~Base(){};

virtual void Hello()const{std::cout IMHO,不要使用会导致类似冲突的名称,也不必使用任何一种语法。@JoachimPileborg:许多人都给出了这个建议,但我发现我的角色使用相同的名称更为明显,尤其是在直接赋值时(一个任务只有一个名称)我会修饰其中一个名称。我非常喜欢trailing u作为成员变量修饰符。或者,您可以使用前缀“m_u”作为成员和/或“a_u”对于争论来说,重要的是选择一种风格并坚持下去。IMHO,不要使用会引起类似冲突的名称,你也不必使用任何一种语法。@JoachimPileborg:许多人都给出了这个建议,但我发现我的角色使用相同的名称更为明显,特别是在直接赋值的情况下(一个任务只有一个名称)我会修饰其中一个名称。我非常喜欢trailing u作为成员变量修饰符。或者,您可以使用前缀“m_u”作为成员和/或“a_u”作为参数。重要的是选择一种样式并坚持它。