目录
作用域
分类
- 命名空间域
- 局部域
- 全局域
- 类域
还有其他的,我们这里不涉及
域作用限定符::
是一个通用的符号
- 对于类域来说,可以访问类的静态成员 / 在类外定义成员函数
- 对于其他域来说,可以访问特定命名空间内的成员
类域
介绍
类域内定义的成员变量和成员函数的名称在类的范围内是可见的
C++类域的管理:
- 使得程序可以通过封装来组织代码,控制成员的访问权限,保证数据的私密性和安全性
- 同时,使用类域和作用域解析运算符也有助于避免命名冲突,使代码更为清晰和可维护
示例
class MyClass { public: static int staticVar; // 静态成员变量 void memberFunction(); // 成员函数声明 }; int MyClass::staticVar = 10; // 静态成员变量定义 void MyClass::memberFunction() { // 成员函数定义 } int main() { MyClass::staticVar = 20; // 访问静态成员变量 MyClass obj; obj.memberFunction(); // 调用成员函数 return 0; }
命名空间域
介绍
标识符在程序中可见和可访问的范围
- 用namespace关键字定义一个命名空间
示例
#include <iostream> // 定义一个全局命名空间 namespace GlobalNamespace { int globalVariable = 10; void globalFunction() { std::cout << "This is a global function." << std::endl; } // 定义一个嵌套命名空间 namespace NestedNamespace { void nestedFunction() { std::cout << "This is a nested function." << std::endl; } } } int main() { // 访问全局命名空间的变量和函数 std::cout << "Global variable: " << GlobalNamespace::globalVariable << std::endl; GlobalNamespace::globalFunction(); // 访问嵌套命名空间的函数 GlobalNamespace::NestedNamespace::nestedFunction(); return 0; }
#include<iostream> std::cout << a << std::endl;
总之是使用命名空间的名字+'::' 来访问特定命名空间的成员
展开命名空间
介绍
将特定命名空间中的所有成员引入到当前作用域的方式,使得在使用这些成员时不需要每次都加上命名空间的前缀
- 展开后相当于将内容暴露在全局中
- 因此被展开的内容中 不可以包含 与全局变量同名 的变量
语法 -- using namespace + 命名空间名
全部展开
std
std命名空间是C++标准库中定义的一个命名空间,其中包含了许多标准的C++库组件,如容器、算法、迭代器、输入输出操作等
- 标准模板库(Standard Template Library,STL)
- 在C++中,几乎所有的标准库组件都被放置在std命名空间中
示例
#include<iostream> using namespace std;
如果我们全部展开这个命名空间有一定风险,相当于是可以直接使用c++中所有的成员
- 如果我们的定义和库里有冲突,就会报错
- 但在我们平时的练习中一般不会出现这样的问题
- 主要是在写项目的时候,代码量庞大,可能就会有差错(建议指定访问)
部分展开
#include<iostream> using std::cout; int main() { //局部域 int a = 3; //std::cout << a << std::endl; cout << a << endl; //这样也可以直接用 return 0; }
只展开其中的一个命名空间
全局域
介绍
在全局域中定义的变量、函数和类具有全局作用域,它们可以被程序中的任何其他作用域所访问
- ::x访问全局域 (前面可以加空格,也可以不加)
优先级
引入
知道了域的分类后,当我们有三个同名变量而不标明具体访问谁时,是优先访问哪里的a呢?
#include<iostream> //全局域 int a = 1; //命名空间域 namespace one { int a = 2; } int main() { //局部域 int a = 3; std::cout << a << std::endl; return 0; }
答案是:优先局部啦~(就近原则)
介绍
当全局域,局部域,命名空间域都存在时,默认变量访问顺序: 局部域->全局域->命名空间域
- 要注意,命名空间域如果不主动去访问,是不会自己访问的
示例
下图是分别访问三个域的同名变量
缺省参数
定义
先看一段代码叭~
void func(int a = 1) { cout << a << endl; } int main() { func(); func(2); return 0; }
这里形参被指定了一个缺省值
- 在调用该函数时,如果没有指定实参,则使用该形参的缺省值
- 否则还是使用传入的实参
分类
全缺省
函数所有参数都有缺省值
半缺省
函数部分参数有缺省值
- 半缺省参数必须按照从右到左给出
也许你会很奇怪为什么要这么规定,看看下面的代码你就知道啦:
- 如果按照从左向右给出,实参的1究竟给谁呢?
- 要是给a,那c就没有传入的参数,会产生错误,所以会产生歧义
修改成这样就可以了:
- 很一目了然的,实参一定是给了形参a
应用
在需要规定数量时,使用缺省参数可以更好地处理每一种情况
- 如果此时已知需要用到的数量,直接传入使用即可
- 如果未知,就可以使用之前设定好的缺省值