C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)


概述

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

举个例子:

#include <stdio.h>
#include <stdlib.h>

int rand = 10;

int main()
{
	printf("%d", rand);
	return 0;
}

程序编译的结果显示rand重定义了,为什么会这样呢?因为在stdlib.h这个头文件中已经定义了rand这样一个函数,这样就导致了编译器不知道这是一个函数还是一个变量,C语言中无法应对这种冲突,只能通过改名字来避免。

C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)

而C++为了解决这个问题,引入了命名空间的概念。

命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

//命名空间
//A就是命名空间的名字
namespace A{
	int a;
	void func()
	{}
}

注意事项:

  • 命名空间只能写在全局
  • 命名空间可以嵌套命名空间
  • 命名空间是开放的,随时可以加入新的成员,但是新加入的成员只能在加入后使用
  • 匿名命名空间就类似于static
  • 命名空间可以取别名
  • 分文件编写的时候,如果头文件有两个命名空间,但是里面的成员函数或者成员变量同名的时候,在cpp重实现函数需要加上命名空间

接下来给一个完整的代码块来展示命名空间的注意事项和使用:

#include<iostream> //引入头文件
#include<string>//C++中的字符串
using namespace std; //标准命名空间
//A就是命名空间的名字
namespace A
{	
	//命名空间内既可以定义变量也可以定义函数
	int rand = 10;
	int Sub(int x, int y)
	{
		return x + y;
	}
	struct ListNode
	{
		int data;
		struct ListNode* next;
	};
}
//命名空间的嵌套定义
namespace B
{
	int rand;
	namespace C
	{
		int rand;
	}
}
//命名空间是开放的,随时可以加入新成员,但是新成员只能在加入后使用
namespace B
{
	int c;//此时c会合并到命名空间B中,实际上就是个合并的过程
}
//匿名命名空间
namespace 
{
	int d = 5;//命名空间没有名字,就类似于static int d = 50,是个静态全局变量,别的文件无法使用
}
int main()
{
	//命名空间的使用
	//1.::作用域限定符
	//访问A空间的Sub函数
	cout << A::Sub(10, 20) << endl;
	//2.访问嵌套空间
	//访问B空间的C空间的rand变量
	B::C::rand = 5;
	cout << B::C::rand << endl;

	system("pause");
	return EXIT_SUCCESS;
}

using关键字

引入using关键字之后,命名空间的使用又变得不一样

  • 用using将命名空间的成员引入
namespace A
{
	int a = 10;
}
void test01()
{
	//using声明的意思就是让命名空间中某个标识符可以直接使用
	using A::a;
	cout<<a<<endl;
}

注意:

1.使用using声明,就不会每次写A::a了,直接用a就可以

2.using A::a声明的意思就是把变量a又在test函数中定义了一次,此时如果在test内部再定义一个int a;就会出错

  • 用using namespace 命名空间名称引入
namespace A
{
	int a = 10;
}
using namespace A;
void test01()
{
	cout<<a<<endl;
}

使用using关键字修饰namespace整个命名空间,实际上就是脱去了这个命名空间的外衣,就等价于你定义了一个int a在全局

思考一个问题:下面代码有错吗?

在test01函数体内又定义了一个int a,会报错么?如果不报错,那么输出的是全局的 a = 10 还是局部的a = 20?

namespace A
{
	int a = 10;
}
using namespace A;
void test01()
{
	int a = 20;
	cout<<a<<endl;
}

答案是不会报错,输出的是局部的20,因为命名空间A内部的变量a在使用using关键字后相当于在全局定义了一个int a ;而在函数体内定义一个局部的 int a;两个变量的作用域不同,是可以定义同名变量的,输出的是局部变量的值,小伙伴的要注意区分~

C++输入和输出

  • C语言用的是printf和scanf进行输入和输出的。那么C++是用什么来进行输入输出的呢?
  • C++用到的是cout(控制台)和cin(键盘)两个函数进行操作,使用是必须包含iostream的头文件及 std标准命名空间。
  • C++头文件不带.h,将std标准命名空间进行展开。

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293145.html

(0)
上一篇 2022年11月14日
下一篇 2022年11月15日

相关推荐

发表回复

登录后才能评论