这是我的代码
#include <iostream>
using namespace std;
int x = 5;
int main()
{
int x = 1;
cout << "The variable x: " << x << endl;
}
我得到1
作为输出,但我希望有5
,就像访问全局x
变量一样。
这可能吗?
您应该使用::x
来访问本地作用域中的全局变量。运算符::
是一元作用域解析运算符。所以你的代码应该是:
#include <iostream>
using namespace std;
int x = 5;
int main()
{
int x = 1;
cout << "The variable x: " << ::x << endl;
}
注:::
运算符在C++中有两层含义:
- 二进制作用域解析运算符
- 一元作用域解析运算符
几乎在你的整个编码时间里,你都会使用二进制范围解析运算符。因此,尽管这个问题的答案是一元范围解析运算符;为了便于将来参考,我列举了Binary作用域解析运算符的一些典型用例。
二进制作用域解析运算符的使用情况:
1.在类外定义函数
我们将代码组织为扩展名为.h的头文件和扩展名为.cpp。在代码文件中定义函数时,我们使用::
二进制范围解析运算符。
例如,Car.h文件看起来像:
class Car
{
private:
int model;
int price;
public:
void drive();
void accelerate();
};
并且Car.cpp看起来像:
void Car :: drive()
{
// Driving logic.
}
void Car :: accelerate()
{
// Logic for accelerating.
}
在这里,我们可以很容易地注意到,::
作用于两个操作数:
- 类名
- 函数名称
因此,它本质上定义了函数的范围,即它通知编译器函数drive()属于类Car。
2.解决来自不同类的具有相同模板的两个函数之间的歧义
考虑以下代码:
#include <iostream>
using namespace std;
class Vehicle
{
public:
void drive()
{
cout << "I am driving a Vehicle.n";
}
};
class Car
{
public:
void drive()
{
cout << "I am driving a Car.n";
}
};
class BMW : public Car, public Vehicle
{
// BMW specific functions.
};
int main(int arc, char **argv)
{
BMW b;
b.drive(); // This will give compile error as the call is ambiguous.
b.Car::drive(); // Will call Car's drive method.
b.Vehicle::drive(); // Will call Vehicle's drive method.
}
由于类BMW的两个派生函数具有相同的模板,调用b.drive
将导致编译错误。因此,为了指定我们想要的驱动器(),我们使用::
运算符。
3.覆盖被覆盖的功能
二进制作用域解析运算符有助于调用基类的函数,该函数在派生类中使用派生类的对象重写。请参阅以下代码:
#include <iostream>
using namespace std;
class Car
{
public:
void drive()
{
cout << "I am driving Car.n";
}
};
class BMW : public Car
{
public:
void drive()
{
cout << "I am driving BMWn";
}
};
int main(int argc, char** argv)
{
BMW b;
b.drive(); // Will call BMW's drive function.
b.Car::drive(); // Will call Car's drive function.
}
4.访问静态数据成员
正如我们所知,静态数据成员是由该类的对象按类共享的。因此,我们不应该(尽管我们可以)使用对象来确定静态变量的范围。请参阅以下代码:
#include <iostream>
using namespace std;
class Car
{
public:
static int car_variable;
};
int Car :: car_variable;
int main(int argc, char** argv)
{
Car :: car_variable = 10;
cout << "Car variable: " << Car :: car_variable << 'n';
return 0;
}