C++中的命名空间和缺省函数

一 .  命名空间

1.  出现的原因

        原因:为了防止我们自定义的标识符和C++库中的标识符冲突,通过定义命名空间的办法,来使得自行定义的和库中的区分开来。

        举例代码如下:

#include <stdio.h>
#include <stdlib.h>
//rand本来是stdlib.h库中的函数
namespace bit		
{
	int rand = 0;			//通过命名空间自行创建的int型的rand变量
}

int main()
{
	printf("%p\n", rand);		//stdlib.h库中的函数rand
	printf("%d\n", bit::rand);	//我们创建的rand
	
	return 0;
}

        运行的结果:

       

        通过这种方法来消除我们和库因为同名而造成的冲突。


2.  数据使用的优先级

        对于程序中的变量,编译器对它的查找是有优先级的

编译默认查找有高到低依次为:

  1. 当前的局部域

  2. 全局域

  3. 展开的命名空间

#include <iostream>

//2.全局
int temp = 2;

//3.命名空间
namespace bit
{
	int temp = 3;
}

//展开命名空间
using namespace std;
using namespace bit;

int main()
{
	//1.局部
	int temp = 1;
	cout << temp << endl;
	//优先级:局部>全局>命名空间
	//		 temp = 1 > =2 > =3   
	return 0;
}

3.  三种方式使用命名空间

  1. 指定访问

  2. 全展开

  3. 指定展开的某一个

       具体写法格式和使用如下:

#include <iostream>

//创建好命名空间
namespace bit
{
	int LittleBit = 1;
	int BigDream = 0;
}

int main()
{
	//1.指定访问  格式: 命名空间名::标识符  
	//					 如: bit::LittleBit
	printf("%s\n", "指定访问");
	printf("%d\n", bit::LittleBit);
	printf("%d\n", bit::BigDream);

	//2.全展开	格式:using namespace 命名空间名
	//	    	  如:using namespace bit;
	// 此时的标识符可直接使用
	using namespace bit;
	printf("%s\n", "全展开");
	printf("%d\n", LittleBit);
	printf("%d\n", BigDream);

	//3.指定单一展开	格式:using 命名空间名::标识符
	//					  如:using bit::LittleBit;
	// 此时的标识符可直接使用
	using bit::LittleBit;
	using bit::BigDream;
	printf("%s\n", "指定单一展开");
	printf("%d\n", LittleBit);
	printf("%d\n", BigDream);
	
	return 0;
}

4.命名空间可包裹和合并命名空间

#include <iostream>

namespace bit
{
	int a = 1;
	//命名空间可内部嵌套另一个命名空间
	namespace dream
	{
		int b = 2;
	}
}

//同名的命名空间将合并成一个
namespace bit
{
	int c = 3;
}

using namespace std;
using namespace bit;
using namespace dream;

int main()
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;

	return 0;
}

        

二 .  C++的输入和输出

std::cin 一 输入流;       

std::cout 一 输出流;

cin和cout都具有自动识别类型的功能。

三 .  缺省函数

        缺省参数是指在参数列表(函数特征标)中对参数进行有规则的赋值。

    1.参数的值的规则

        其中参数的值是有规则的:

                1.未进行传参 则会使用定义时设置的值。         

                 2.进行传参 则值会被我们传入的参数所更新替代。

        代码如下:

#include <iostream>

using namespace std;
//缺省参数
void FuncA(int a = 1)
{
	cout << a << endl;
}

int main()
{
	FuncA();	//未进行传参 则会使用定义时设置的值
	FuncA(0);	//  进行传参 则值会被我们传入的参数所更新替代

	return 0;
}

  2. 全缺省函数和半缺省函数

  1. 全缺省函数指的是参数列表中所有的参数都在定义时设置了初值

  2. 半缺省函数指的是参数列表中一部分参数没有设置初值

               全缺省函数传值是不能跳跃传递的,必须要按照顺序传参,比如:


#include <iostream>

using namespace std;

//全缺省参数
void FuncB(int a = 1, int b = 2, int c = 3)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

int main()
{
	FuncB();			// 1 2 3
	FuncB(4);			// 4 2 3
	FuncB(4,5);			// 4 5 3 
	FuncB(4, 5, 6);		// 4 5 6
	//FuncB(4, , 6);	//不允许跳跃传值  编译时会报错

	return 0;
}

         半缺省函数只能从参数列表的右边开始缺省(这里的缺省指的是函数定义时对参数设置初值),而且不允许跳跃式的缺省和传参,代码示例:

#include <iostream>

using namespace std;

//左缺省
//void FuncC(int a = 1, int b = 2, int c)	//编译时会报错
//{
//
//}

//跳跃式缺省
//void FuncD(int a, int b = 1, int c)		//编译时会报错
//{
//
//}

//右缺省
void FuncE(int a, int b = 2, int c = 3)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

int main()
{
	FuncE(4);			//4 2 3
	FuncE(4, 5, 6);		//4 5 6
	//跳跃式传递
	//FuncE(4, , 5);		//编译前就会报错 不允许

	return 0;
}

本博客仅供个人参考,如有错误请多多包含。


 Aruinsches-C++初阶日志-3/28/2024


相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 23:44:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 23:44:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 23:44:01       87 阅读
  4. Python语言-面向对象

    2024-03-29 23:44:01       96 阅读

热门阅读

  1. 第八章 编译时编程

    2024-03-29 23:44:01       33 阅读
  2. 利用TCP发布GNSS数据(ROS2转ROS1)

    2024-03-29 23:44:01       43 阅读
  3. excel 快捷键表

    2024-03-29 23:44:01       37 阅读
  4. 【嵌入式——QT】QByteArray

    2024-03-29 23:44:01       50 阅读
  5. 速成软件书:真的是神器吗?

    2024-03-29 23:44:01       44 阅读
  6. 战略定位--选择什么赛道。成为什么样的企业。

    2024-03-29 23:44:01       35 阅读
  7. Ubuntu22.04安装WordPress教程

    2024-03-29 23:44:01       35 阅读
  8. CCF-CSP认证考试 202212-4 聚集方差 100分题解

    2024-03-29 23:44:01       32 阅读
  9. 基于机器视觉的智能物流机器人的设计与开发

    2024-03-29 23:44:01       30 阅读
  10. 基于AOP实现自定义注解

    2024-03-29 23:44:01       39 阅读
  11. ARM的开源硬件

    2024-03-29 23:44:01       41 阅读
  12. Golang中四种gRPC模式

    2024-03-29 23:44:01       37 阅读
  13. git 合并当前分支到 指定仓库的指定分支

    2024-03-29 23:44:01       44 阅读