c++中双冒号的使用场景

文章目录

    • c++中双冒号的使用场景
        • 1 - 基类成员
        • 2 - 类、类型成员
        • 3 - 容器、类型成员
        • 4 - 命名空间中使用
        • 5 - 在类外定义成员函数
        • 6 - 覆盖名字查找

c++中双冒号的使用场景

2022年12月12日

我看这篇文章的初衷,是为了搞明白qt的代码中,双冒号的意思。

因为现在我的C++基础还很差。

但是,我看了这一篇文章,我发现,很多地方,我更加看不懂了。

但是这个双冒号,使用场景的总结,还是值得收藏记录的。

参考文章:[C++中双冒号::的使用场景 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/439155000)

发现网上对C++中双冒号的介绍都不是很全面,这里详细的介绍一下。

::名为作用域运算符,最常见的场景如下:

using std::cout;
int main()
{
    int a;
    std::cin >> a;
    cout << a << std::endl; 
    return 0;
}

除此之外,作用域运算符还有很多其它的应用场景:

1 - 基类成员

在某些情况下,希望对虚函数的调用不要进行动态绑定

而是强迫其执行虚函数的某个特定版本

通常情况下,只有成员函数(或友元)中的代码才需要使用。

class Window{
    public:
        virtual void onResize(){}
};

class SpecialWindow : public Window{
    public:
        virtual void onResize(){
            Window::onResize();
        }
};

如果一个派生类虚函数需要调用它的基类版本,但是没有使用作用域运算符

则在运行时、该调用将被解析为、对派生类自身的调用,

从而导致无限递归

2 - 类、类型成员

标准库中string的size函数、的返回值是一个string::size_type类型

这是一个无符号类型的值,而且足够存放下任何string对象的大小。

string::size_type len = s.size();

3 - 容器、类型成员

vector<int> v = {1,2,3,4};
vector<int>::iterator it = v.begin();

4 - 命名空间中使用

namespace my{
    void print(){
        cout << "namespace" << endl;
    }
}

int main()
{
    my::print();
    return 0;
}

5 - 在类外定义成员函数

class A{
public:
    void funA();
};
void A::funA(){
    cout << "A::funA" << endl;
}

6 - 覆盖名字查找

下面的例子中,有一个全局的height变量。

但是函数fun的参数、把全局的那个height隐藏了。

如果我们需要的是外层作用域中的名字,可以显式地通过作用域运算符来进行请求:

int height = 0;

void fun(int height){
    cout << height << endl;
    cout << ::height << endl;
}

我这里总结得应该是比较全面的了,如有遗漏,欢迎大家补充。

你可能感兴趣的:(c++,开发语言)