The prepended double colon is also known as the scope resolution operator.
C++的作用域运算符是采用两个冒号来表示,即 :: 。其目的在于用来决议多继承中的重名成员。用法有以下几种:
类和类的成员之间(类外定义函数)
比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。
#include<iostream>
using namespace std;
class Example {
int num;
public:
Example() {
num = 10;
}
void display();
};
void Example::display() {
cout << "The value of num is: "<<num;;
}
int main() {
Example obj;
obj.display();
return 0;
}
作用域(当本地变量和全局变量拥有相同名字时访问全局变量)
::一般还有一种用法,就是直接用在全局函数前,表示是全局函数。当类的成员函数跟类外的一个全局函数同名时,在类内定义的时候,打此函数名默认调用的是本身的成员函数;如果要调用同名的全局函数时,就必须打上::以示区别。比如在VC里,你可以在调用API函数时,在API函数名前加::。
#include<iostream>
using namespace std;
int num = 7;
int main() {
int num = 3;
cout << "Value of local variable num is: " << num;
cout << "\nValue of global variable num is: " << ::num;
return 0;
}
//output
Value of local variable num is: 3
Value of global variable num is: 7
面试tips
分类
- 全局作用域符(
::name
):用于类型名称(类、类成员、成员函数、变量等)前,表示作用域为全局命名空间 - 类作用域符(
class::name
):用于表示指定类型的作用域范围是具体某个类的 - 命名空间作用域符(
namespace::name
):用于表示指定类型的作用域范围是具体某个命名空间的
int count = 11; // 全局(::)的 count
class A {
public:
static int count; // 类 A 的 count(A::count)
};
int A::count = 21;
void fun()
{
int count = 31; // 初始化局部的 count 为 31
count = 32; // 设置局部的 count 的值为 32
}
int main() {
::count = 12; // 测试 1:设置全局的 count 的值为 12
A::count = 22; // 测试 2:设置类 A 的 count 为 22
fun(); // 测试 3
return 0;
}