c++作用域(类域,命名空间域,如何展开),全局/局部/命名空间域的优先级,缺省参数(全缺省,半缺省,应用)

目录

作用域

分类

域作用限定符::

类域

介绍

示例 

命名空间域

介绍

示例

展开命名空间

介绍

全部展开

std

示例

部分展开

全局域

介绍

优先级

引入

介绍

示例

缺省参数 

定义

分类

全缺省

半缺省

应用 


作用域

分类

  • 命名空间域
  • 局部域
  • 全局域
  • 类域

还有其他的,我们这里不涉及

域作用限定符::

是一个通用的符号

  • 对于类域来说,可以访问类的静态成员 / 在类外定义成员函数
  • 对于其他域来说,可以访问特定命名空间内的成员

类域

介绍

类域内定义的成员变量和成员函数的名称在类的范围内是可见的

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

应用 

在需要规定数量时,使用缺省参数可以更好地处理每一种情况

  • 如果此时已知需要用到的数量,直接传入使用即可
  • 如果未知,就可以使用之前设定好的缺省值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值