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”作为参数。重要的是选择一种样式并坚持它。