C++的作用域详细解读
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
写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多了两个作用域:名字空间作用域和类作用域
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!