C++的作用域详细解读

2023-12-22 16:16:54

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

写C++离不开一个重要的概念那就是作用域,作用域是C++语言非常重要的一个概念,接下来我们就一起看看C++的作用域。


一、作用域是什么?

C++ 中的作用域(scope)指的是变量、函数或其他标识符的可见和可访问的范围。

二、作用域类别

C++有5种作用域,具体详见下面。

1.全局作用域(global scope)

除非名字定义在一个语言结构中(比如,一个类或函数),否则就是全局作用域。其实,全局作用域概念应该放在最下面更容易理解,只要不是其它4种作用域就是全局作用域,这下通俗易懂了吧!

示例:

#include <iostream>

int a = 0;

int main(){
}

上面的变量a所在的作用域就是全局作用域。

2.名字空间作用域(namespace scope)

定义在名字空间中的名字,且不在某个语言结构中(比如,一个类或函数),就是名字空间作用域。这里特别注意下不在某个语言结构中这句话,如果在呢?那就是别的作用域了!

示例:

#include <iostream>

namespace WebCore {
    int a = 0;
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    std::cout << "a: "<<WebCore::a<< std::endl;
    return 0;
}

上面的a所在的作用域就是名字空间作用域。

3.局部作用域(local scope)

如果名字在一个函数内声明(包括函数的参数),则它的作用域就是局部作用域。这里需要特别注意的是函数自己的参数也是局部作用域,和内部定义的名字一样。

示例:

#include <iostream>

void test(int a) {
    int b = 0;
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

上面的函数test里面的a和b所在的作用域都是局部作用域。

4.类作用域(class scope)

如果名字是类的一个成员,则它的作用域是为类作用域。这个应该接触的太多了,类里面定义的成员字段和成员函数都是类作用域。

示例:

#include <iostream>

class Demo {
private:
    int a;
public:
    void print() {}
};

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

类Demo的私有成员a和公有成员print都是类作用域,只不过print这个名字可能不是好名字,大家不要这么命名。

5.语句作用域(statement scope)

名字声明在一个for、while、switch或if语句中的作用域就是语句作用域。
示例:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    if (true){
        int a = 0;
    }
    return 0;
}

这句写的很low,if语句必然执行,当然这只是演示,不要太较真。a的作用域就是语句作用域,我们的目的达到了。

三、复杂情况

接着上面的说,如果一个名字即在名字空间中,又在函数中,又在语句中,它属于哪种作用域?
示例:

#include <iostream>

int a;//全局作用域

namespace WebCore {
    class Demo {
    private:
        int a;//类作用域
    public:
        void print() {}//类作用域
    };

    int a = 0;//名字空间作用域

    void test(int a) {//局部作用域
        int b = a;//局部作用域
        if (a) {
            int a = 0;//语句作用域
        }
    }
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

定义了一堆的a,这或许不是好的命名方式,但是一个好的演示方式。


总结

1、学好C++作用域必须理解透彻,这样才能用好!
2、C++比C多了两个作用域:名字空间作用域和类作用域

文章来源:https://blog.csdn.net/jiexijihe945/article/details/135152662
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。