C++:命名空间namescape,缺省参数

本文详细介绍了C++中的命名空间如何避免命名冲突,包括定义、规则、使用方法,以及std命名空间在输入输出中的应用。同时讨论了缺省参数的概念和限制。
摘要由CSDN通过智能技术生成

1.命名空间namescape

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

在这里插入图片描述

1.1命名空间namescape定义

定义命名空间格式 :

namescape(关键字) name(命名空间名) { } 

命名空间内容:

// 1. 正常的命名空间定义
namespace Lvision
{
// 命名空间中可以定义变量/函数/类型/结构体
int rand = 10;
int Add(int left, int right)
	{
		return left + right;
	}
struct Node
	{
		struct Node* next;
		int val;
	};
}

1.2命名空间namescape规则

  1. 在同一个文件中, 可以定义相同名字的命名空间 , 但不能有相同名字的变量

在这里插入图片描述

同一作用域下,定义了相同的变量名就会报错: error C2374: “Lvision::a”: 重定义;多次初始化
在这里插入图片描述

  1. 命名空间允许嵌套
    在这里插入图片描述
  2. 同一个工程中,允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// test.h
namespace N1
{
int Mul(int left, int right)
	{
		return left * right;
	}
}

// test.cpp
namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N2
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

一个工程中的test.h和上面test.cpp中两个N1会被合并成一个

2.2 命名空间使用

namespace bit
{
	// 命名空间中可以定义变量/函数/类型
int a = 0;
int b = 1;
int Add(int left, int right)
{
	return left + right;
}
struct Node
	{
			struct Node* next;
			int val;
	};
}
int main()
{
// 编译报错:error C2065: “a”: 未声明的标识符 如何使用a?
printf("%d\n", a);
return 0;
}

命名空间的使用有三种方式:

  1. 加命名空间名称及作用域限定符 ::
int main()
{
printf("%d\n", N::a); //使用命名空间N中的a
return 0;
}
  1. 使用using将命名空间中某个成员引入
using N::b; //至扩展出N里b的变量, N里其他的变量不扩展
int main()
{
	printf("%d\n", N::a);
	printf("%d\n", b);
	return 0;
}
  1. 使用using namespace 命名空间名称 引入
using namespce N; // 扩展出N中所有的变量
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}

3 C++输入&输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
	cout<<"Hello world!!!"<<endl;
	return 0;
}

在这里插入图片描述

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含 iostream 头文件
    以及按命名空间使用方法使用std。
  2. coutcin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含iostream 头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型。
  5. coutcin分别是ostreamistream类型的对象。

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,
规定C++头文件不带.h;旧编译器(vc 6.0)中还支持< iostream.h >格式,后续编译器已不支持,因此推荐使用< iostream >+std的方式。

4. 缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参

void Func(int a = 0)
{
	cout<<a<<endl;
}
int main()
{
	Func(); // 没有传参时,使用参数的默认值 也就是 a = 0
	Func(10); // 传参时,使用指定的实参 也就是 a = 10
	return 0;
}

注意:
1. 缺省函数的缺省参数只能从右往左,也就是缺省参数不能在实参前面,

//允许
void Func(int a = 10, int b = 20, int c = 30)
{
	cout<<"a = "<<a<<endl;
	cout<<"b = "<<b<<endl;
	cout<<"c = "<<c<<endl;
}

//允许
void Func(int a , int b = 20, int c = 30)
{
	cout<<"a = "<<a<<endl;
	cout<<"b = "<<b<<endl;
	cout<<"c = "<<c<<endl;
}

//不允许
void Func(int a = 10, int b , int c = 30)
{
	cout<<"a = "<<a<<endl;
	cout<<"b = "<<b<<endl;
	cout<<"c = "<<c<<endl;
}
  1. 缺省值必须是常量或者全局变量
  2. C语言不支持(编译器不支持)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值