• 【C++初阶(一)】学习前言 命名空间与IO流


    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。

    💓博主csdn个人主页小小unicorn
    ⏩专栏分类:C++
    🚚代码仓库:小小unicorn的代码仓库🚚
    🌹🌹🌹关注我带你学习编程知识

    什么是C++

    C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

    C++发展史

    1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。

    我们先来看下C++的历史版本:
    在这里插入图片描述
    现在公司主流使用还是C++98和C++11。

    关于C++2X最新特性的讨论:
    https://zhuanlan.zhihu.com/p/107360459

    C++现状:

    C/C++在TIOBE编程语言社区
    常年位居前五
    在23年更是霸榜前三!
    在这里插入图片描述

    C++在工作领域中的应用

    1. 操作系统以及大型系统软件开发
    2. 服务器端开发
    3. 游戏开发
    4. 嵌入式和物联网领域
    5. 数字图像处理
    6. 人工智能
    7. 分布式应用

    C++入门部分

    C++关键字:

    C++总计63个关键字,C语言32个关键字。
    在这里插入图片描述

    命名空间:

    在介绍命名空间之前,先看下面代码所示:

    #include
    
    int rand = 10;
    
    int main()
    {
    
    	printf("%d", rand);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这个代码很简单,实现的功能就是打印rand函数的值。(这里赋值为10.并且以全局变量定义)

    那我们在这个代码实现的基础上加一个头文件:

    #include
    
    • 1

    也就是说:

    #include
    #include
    
    int rand = 10;
    
    int main()
    {
    
    	printf("%d", rand);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我们看一下在编译器中运行的结果:
    在这里插入图片描述
    加了个头文件后,编译器报错了,这是为什么呢?

    我们看报错原因:说是rand函数重定义。这是因为在库中已经有了rand这个函数,如果再次使用rand这个名字定义变量或者函数时,编译器会分不清你到底想使用哪个rand,因而报错。

    那么如何解决这个问题呢?
    这就是我们要首先介绍的命名空间

    C++为了解决C语言上述的问题
    引出了命名空间这种玩法
    (C++兼容C语言的所有语法)

    命名空间定义:

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

     //NIC是命名空间的名字,一般开发中是用项目名字做命名空间名。
    namespace NIC
    {
    	// 命名空间中可以定义变量/函数/类型
    	int rand = 10;//变量
    
    	int Add(int left, int right)//函数
    	{
    		return left + right;
    	}
    
    	struct Test//结构体
    	{
    		int a[10];
    		int val;
    	};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    命名空间相当于一个独立的作用域
    命名空间中所有内容都局限于该命名空间中

    在这里插入图片描述

    当然,命名空间也可以嵌套:

    namespace NIC
    {
    	// 命名空间中可以定义变量/函数/类型
    	int rand = 10;//变量
    
    	int Add(int left, int right)//函数
    	{
    		return left + right;
    	}
    
    	struct Test//结构体
    	{
    		int a[10];
    		int val;
    	};
    
    	//命名空间的嵌套:
    	namespace NIC2
    	{
    		int a;
    		int b;
    		
    
    		int sum(int x, int y)
    		{
    			return x + y;
    		}
    
    		struct Student
    		{
    			int ID;
    			char Name[20];
    		};
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    命名空间的使用:

    那么我们回到我们最初的那个问题,既然我们现在知道了是函数冲突产生的问题,并且用命名空间解决,那么如何使用呢?

    先看下面代码示例:

    int main()
    {
    
    	printf("%d", NIC::rand);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们刚才把rand函数包装在了我们的命名空间里,这里我们要打印rand的值,采用了命名空间名+::的形式,这就是使用命名空间的第一种方法:加命名空间名称及作用域限定符。

    方法一:加命名空间名称及作用域限定符(不展开命名空间)

    :: 域作用限定符。
    通过域作用符我们就可以访问命名空间中的成员:

    int main()
    {
    	printf("%d\n", NIC::rand);
    	int b = NIC::Add(1, 3);
    	printf("%d", b);
    	struct NIC::Test node;
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果显示:
    在这里插入图片描述

    这个代码示例我们访问了我们命名空间里面的rand和Add函数。最后一个我们开辟了结构体的新节点。

    方法二:使用using将命名空间中某个成员引入(展开空间中部分内容)

    假设NIC空间中的rand使用频率很高
    可以将rand变量单独展开到全局域

    using NIC::rand;
    
    • 1

    假设NIC空间中的Add函数使用频率很高
    可以将Add函数单独展开到全局域

    using NIC::Add;
    
    • 1

    看一下测试代码:

    using  NIC::rand;
    int main()
    {
    	int b = rand;//rand展开直接用
    
    	int c = NIC::Add(3, 5);//Add没有展开,需要用域作用符::访问
    
    	printf("%d\n%d", b, c);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果如下:
    在这里插入图片描述

    方法三:使用using namespace 命名空间名称 引入(展开空间中全部内容)

    在空间NIC后面加上

    using namespace NEO;
    
    • 1

    这句话的意思是:
    将空间NIC展开为全局域

    我们在看C++程序时经常看见:

    using namespace std;
    
    • 1

    std就是C++的标准库。

    当NIC空间被展开后
    空间里的所有内容可以直接使用:

    namespace NIC
    {
    	// 命名空间中可以定义变量/函数/类型
    	int rand = 10;//变量
    
    	int Add(int left, int right)//函数
    	{
    		return left + right;
    	}
    
    	struct Test//结构体
    	{
    		int a[10];
    		int val;
    	};
    
    
    	//命名空间的嵌套:
    	namespace NIC2
    	{
    		int a;
    		int b;
    	   int sum(int x, int y)
    	   {
    	   return x + y;
    	   }
    	   struct Student
           {
    	    int ID;
    	    char Name[20];
    	    };
    	}
    }
    
    
    using namespace NIC;
    int main()
    {
    	int b = rand;
    	printf("%d", b);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    结果如下:
    在这里插入图片描述

    对命名空间展开的思考

    假设我们将自定义NIC空间和标准库的std空间同时展开
    那么整型变量rand和rand函数同时暴露在全局域
    我们再去使用它时也会报错:

    using namespace std;
    using namespace NIC;
    
    
    • 1
    • 2
    • 3

    所以直接展开std标准库也有冲突风险
    但是不展开的话,写输入输出会很麻烦

    那么平时写代码时应该怎么办?
    结论:

    1.写项目时,尽量不要展开标准库
    2.日常练习时应该展开标准库
    3.写项目使用部分常用内容展开

    C++输入与输出:

    C语言输入输出方式,相信大家都并不陌生,那么C++如何输入输出呢?

    在C++中,输入输出用的是IO流,跟C语言一样,在使用C++输入输出前要包含一个头文件:

    #include
    
    • 1

    其次,因为输入输出函数直接在库里面,我们可以直接展开std库也可以访问std库。

    using namespace std;
    using std::cout
    using std::cin
    using std::endl
    
    • 1
    • 2
    • 3
    • 4

    具体用什么方式应人而异,根据自己习惯选择。

    cout(标准输出对象(控制台))

    C++中用:cout<< 来进行打印输出。(console:控制台 out:输出)
    <<:流插入运算符

    using std::cout;
    int main()
    {
    	cout << "hello world\n";
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出结果:
    在这里插入图片描述

    从代码示例,我们可以理解为:hello word字符串就是流,流向到对象(终端)中去,进行打印输出。

    补充1:
    在C语言中,根据类型不同,我们用printf函数打印的时候,需要指定格式才能打印:

    int main()
    {
    	int a = 10;
    	double b = 5.5;
    	printf("%d %.2lf", a, b);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    但是我们C++中,会自动识别类型:

    using std::cout;
    int main()
    {
    
    	cout << "hello world\n";
    	int a = 10;
    	double b = 5.5;
    	cout << a<<"\n";
    	cout << b;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出结果:
    在这里插入图片描述
    不仅如此:打印的时候我们可以多次用<<流插入运算符。

    using std::cout;
    int main()
    {
    	cout << "hello world\n";
    	int a = 10;
    	double b = 5.5;
    	cout << a<<"\n"<<b<<"\n"<<"hello world\n"<<'\n';
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出结果:
    在这里插入图片描述
    补充2:
    在C++中,我们可以用endl来表示换行符。(end:结尾 Line:行)

    int main()
    {
    	// IO流
    	// 自动识别输出变量的类型
    	// <<流插入
    	std::cout << "hello world\n";
    	int a = 10;
    	double b = 11.11;
    	//std::cout << a << "\n";
    	//std::cout << b << "\n";
    	std::cout << a << "\n" << b << '\n';
    	std::cout << a << std::endl << b << std::endl;
    
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出结果:
    在这里插入图片描述

    cin(标准输入对象(键盘))

    C++中用:cin>>来进行获取键盘输入。(console:控制台 in:里面)
    <<:流提取运算符

    using  std::cin;
    using  std::cout;
    using  std::endl;
    int main()
    {
    	int a;
    	double b;
    	// 流提取
    	cin >> a >> b;
    
    	cout << a  << endl << b << endl;
    	cout << a << endl << b << endl;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出结果:
    在这里插入图片描述

    注意:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我
    们可以进行网上查阅并仔细学习。

  • 相关阅读:
    未来可能会被淘汰的编程语言
    Unity之ShaderGraph如何实现无贴图水球效果
    Spring - 单实例Bean 和 多实例Bean 的不同
    智能网联汽车终端T-BOX应用方案——主控芯片ACM32F403、安全芯片S6A/S6B
    新环境下配置jupyter notebook并启动
    Helm3模板-内置函数和Values
    django理解02 前后端分离中的问题
    【深度学习 AIGC】stablediffusion-infinity 在无界限画布中输出绘画 Outpainting
    BurpSuit官方实验室之SQL注入
    Composer交互文档如何在PPT当中使用
  • 原文地址:https://blog.csdn.net/weixin_72066135/article/details/133776894