发现网上对C++中双冒号的介绍都不是很全面,这里详细的介绍一下。
::名为作用域运算符,最常见的场景如下:
using std::cout;
int main()
{
int a;
std::cin >> a;
cout << a << std::endl;
return 0;
}
除此之外,作用域运算符还有很多其它的应用场景:
- 基类成员
在某些情况下,希望对虚函数的调用不要进行动态绑定,而是强迫其执行虚函数的某个特定版本。通常情况下,只有成员函数(或友元)中的代码才需要使用。
class Window{
public:
virtual void onResize(){}
};
class SpecialWindow : public Window{
public:
virtual void onResize(){
Window::onResize();
}
};
如果一个派生类虚函数需要调用它的基类版本,但是没有使用作用域运算符,则在运行时该调用将被解析为对派生类自身的调用,从而导致无限递归。
- 类类型成员
标准库中string的size函数的返回值是一个string::size_type类型(这是一个无符号类型的值,而且足够存放下任何string对象的大小)
string::size_type len = s.size();
- 容器、类型成员
vector<int> v = {1,2,3,4};
vector<int>::iterator it = v.begin();
- 命名空间中使用
namespace my{
void print(){
cout << "namespace" << endl;
}
}
int main()
{
my::print();
return 0;
}
- 在类外定义成员函数
class A{
public:
void funA();
};
void A::funA(){
cout << "A::funA" << endl;
}
- 覆盖名字查找
下面的例子中,有一个全局的height变量,但是函数fun的参数把全局的那个height隐藏了,如果我们需要的是外层作用域中的名字,可以显式地通过作用域运算符来进行请求:
int height = 0;
void fun(int height){
cout << height << endl;
cout << ::height << endl;
}
我这里总结得应该是比较全面的了,如有遗漏,欢迎大家补充