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


  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值