【C++初阶】C++入门相关知识(1):C++历史 & 第一个C++程序 & 命名空间

🎈主页传送门****:良木生香

🔥个人专栏:《C语言》《数据结构-初阶》 《程序设计》

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离



前言:我们在此之前已经学习了C语言和数据结构,明白了C语言的基本概念,同时也学习了初阶的数据结构,现在,我们已经具备了学习初阶c++的能力了,那么,从今天开始,我们就正式进入到C++的学习中了,本专栏会记录下小编的学习C++的历程,有什么讲的不对的地方还请大佬们指出错误,那么,现在我们就正式进入到C++的学习吧


本专栏介绍:在我们之前已经学习过的C语言和数据结构的基础上,我们将会在本C++专栏上继续学习C++语法、STL、以及高阶数据结构


目录

一、C++历史介绍

1.1、起源与诞生(1979~1983)

1.2、核心

1.3发展与完善(1980~1989)

1.4、标准化和定型(1989~1998)

二、C++的版本更新

三、C++参考文档

3.1、参考文档

3.2、C++相关小知识

四、C++的重要性

4.1、编程语言排排行榜

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

五、C++学习建议及推荐的书籍

5.1、学习难度

5.2、推荐的书籍

六、第一个C++程序

6.1、头文件

6.2、命名空间

6.2.1、基本定义:

6.2.2、变量使用方法

6.2.3、命名空间的嵌套使用

6.2.4、命名空间的使用方法

1.指定命名空间访问,项⽬中推荐这种⽅式:

2.展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。这种方式就是我们现在刚开始学习使用到的最常用的方式:

3.using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。


正文开始:

一、C++历史介绍

1.1、起源与诞生(1979~1983)

背景:1979年,Bjarne Stroustrup(本杰尼·斯特劳斯特鲁普)在贝尔实验室工作时,发现传统的C语言在项目开发时,存在有表达能力不足、可拓展性以及可维护性上有些欠缺,为此设计并开发了C++。

1.2、核心

C++是在C语言的基础上引入了类、封装、继承、多态等面向对象的特性,这促使了C++雏形的形成,并在1983年正式更名为"C++"

1.3发展与完善(1980~1989)

发展:随着C++语言在学术界和工业界被逐渐普及,随后被用于教学研究和产品开发

完善:C++的标准库、模板等等特性在此期间得到进一步的发展和完善

1.4、标准化和定型(1989~1998)

启动:1989年,ANSI和ISO联合标准化委员会成立,启动标准化工作

里程碑:1994年提出首个草案,之后决定将STL(标准模板库)纳入标准,极大地丰富了语言的能力

完成:1998年,ANSI/ISO C++正式发布,标志着现代C++的成型

总之,C++的发展史是一条从解决实际问题出发 ,通过引入面向对象范式 增强代码的组织能力,并通过标准化 和吸纳STL等强大的库,演变成为一个功能全面,性能卓越的编程语言的清晰路径

二、C++的版本更新

下面是C++语言的更新时间线:

在1998年C++正式发布之初,C++委员会就制定了他们往后的发展目标,那就是每隔五年进行一次大更新,也就是他们的**"五年计划",**在第一个五年计划当中,也就是C++03这个版本,委员会主要是对C++98的一些漏洞和语法进行修复,并没有发布太多的新功能.程序猿们与也都期待着C++08的发布,希望能够有更好的功能或者库能够使用,但是好景不长,在07年左右,C++标准委员会发现他们貌似不能在规定时间内发布C++08,于是只能将发布时间向后延迟

在2011年,C++11正式发布了,此次发布对C++语言增加了一些新特性,随后C++委员会也认识到,五年计划,目标太宏大,不好实现,不如改成三年计划,后来就有了C++14,17,20,23。如上图所示,C++特性介绍越多,那此次版本更新就越大.

三、C++参考文档

3.1、参考文档

以下是C++的相关参看文档

文档一:参考文档1https://legacy.cplusplus.com/reference/

文档二:参考文档2https://en.cppreference.com/w/cpp.html

小贴士:

参考文档1并不是C++达1官方文档,C++的版本也只是更新到C++11而已,但是这个文档是以头文件的形式呈现的,比较好阅读;

参考文档2是C++官方的英文文档,信息非常的全面,C++版本也更新到了最新的C++23但是阅读起来就没有参考文档1这么方便,参考文档2原本还是有中文版的,但是后面因为某种原因不能访问了

3.2、C++相关小知识

上面两个参考文档其实已经够绝大多数的场景使用了,因为在现阶段的使用中,大多树都是使用到C++98和C++11版本而已,少部分大厂会用到14和17的版本,而C++23现在使用的频率很少,因为编译器甚至没有支持完

为什么呢?因为标准委员会是制定C++版本标准的,而编译器是由各个公司独立开发的,像目前主流的编译器有微软的MSVC,苹果的Clang, 以及**Linux的GCC/G++,**这些大公司开发的编译器决定了我们能使用那些特性。

还有的人会问,C++和python,JAVA相比呢?这么说吧,C++就像是一辆跑车,极具性能,python就像一辆大货车,跑得慢但是装的量大,但是JAVA会比python快,但是比C++慢.

四、C++的重要性

4.1、编程语言排排行榜

下图是截止写这篇文章时热门编程语言的排行榜:

下图是主流编程语言的流行度变化情况:

由以上两图我们可以看到,C++,C语言以及JAVA都是名列前茅的.这些变化并不是衡量编程语言们好坏的标准,反映的则是行业技术趋势和人才需求方向.

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

C++的应⽤领域服务器端、游戏(引擎)、机器学习引擎、⾳视频处理、嵌⼊式软件、电信设备、⾦融应⽤、基础库、操作系统、编译器、基础架构、基础⼯具、硬件交互等很多⽅⾯都有。

|----------|-----------------------------------------------------------------|
| 大型系统软件开发 | 用于开发编译器、数据库、操作系统(如windows,Linux等)、浏览器等底层基础建设 |
| 音视频处理 | 主流技术栈以来C++,常见开源库包括FFmpeg、WebRTC、Mediasoup等, 适用于实时音频解码\流媒体服务等场景 |
| PC客户端开发 | 主要用于Windows桌面软件(如WPS),常常结合QT框架实现跨平台GUI |
| 服务端开发 | 在对性能要求极高的场景中应用,如游戏服务器,高频交易系统,流媒体后台 |
| 游戏引擎开发 | 多数游戏引擎(如Unreal Engine等)使用C++开发,需掌握图形学,数据结构以及物理引擎 |
| 嵌入式开发 | 应用于智能手环,车载系统,工业设备等资源受限场景,可分为 嵌入式应用开发(软件逻辑)和驱动开发(硬件交互) |
| 机器学习交互 | 底层算法(如深度学习框架)多使用C++实现以保证性能,Pyhthon负责上层封装 |
| 测试开发 | 测试开发工程师使用C++编写自动化测试脚本,性能测试工具,或者开发定制化测试工具 |
| 其他领域 | 金融系统:高频交易、风险管理系统等 网络通信:ACE库等支持服务器、客户端程序开发 基础工具:编译器,基础软件设施等 |

由此可见,C++这门语言在现代社会发展中起着举足轻重的作用,学好这门语言可以参与社会中绝大多数的行业生产

五、C++学习建议及推荐的书籍

5.1、学习难度

C++这门语言的学习难度无疑是最难学的编程语言之一,其本身的语言设计和发展历史,决定了这门语言难学难精的特点,在网上流传着这样的梗图---21天精通C++:

5.2、推荐的书籍

对于学习C++这门语言,有三本比较推荐的书籍:

C++ Primer: 主要讲解语法,经典的语法书籍,前后中期都可以看,前期如果⾃学看可能会有点晦涩难懂,能看懂多少看懂多少,就当预习,学了⽐特课程后,中后期作为语法字典,⾮常好⽤。

STL源码剖析: 主要从底层实现的⻆度结合STL源码,庖丁解⽜式剖析STL的实现,是侯捷⽼师的经典之作。可以很好的帮助我们学习别⼈⽤语法是如何实现出⾼效简洁的数据结构和算法代码,如何使⽤ 泛型封装等。让我们不再坐井观天,闭⻔造⻋,本书课程上⼀半以后,中后期可以看。

Effective C++: 本书也是侯捷⽼师翻译的,本书有的⼀句评价,把C++程序员分为看过此书的和没看过此书的。本书主要讲了55个如何正确⾼效使⽤C++的条款,建议中后期可以看⼀遍,⼯作1-2年后再看⼀遍,相信会有不⼀样的收获。

六、第一个C++程序

我们在刚刚学习C语言的时候写了这样一个程序:

cpp 复制代码
#include<stdio.h>

int main() {

	printf("Hello World\n");
	return 0;

}

那么现在我们来看看第一个C++程序是怎么写的:

cpp 复制代码
#include<iostream>
using namespace std;

int main() {
	cout << "Hello World" << endl;
	return 0;
}

可以看出,这两段代码在写法上还是有很大差别的,比如头文件啊,输入输出啊等等方面,那现在我们就慢慢细说

6.1、头文件

C++与C语言的第一个差别是在头文件上,一般来说,C++的头文件是不带有".h"字样的,在标准头文件上,C语言是**<stdio.h>** ,表示的是标准的输入输出(standard input output),而C++的标准头文件则是**<iostream>**,表示的是输入输出流(input output stream)

6.2、命名空间

6.2.1、基本定义:

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员 。命名空间中可以定义变量/函数/类型等。
• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。
• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
• namespace只能定义在全局,当然他还可以嵌套定义。
• 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
• C++标准库都放在⼀个叫std(standard)的命名空间中。

在C++程序上我们可以看到,多了"using namespace std;"这行字,为什么呢?这就要追溯到C++语言的本质了,C++语言的本质是为了解决C语言的不足,为了让语言用起来更加顺畅.

我们在写C语言程序时通常会碰到命名冲突,就是说自己命名的变量头文件中的变量会冲突:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>

int rand = 1;

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

这段代码编译之后就会出现这样的问题:

这样就说明我们现在的变量rand与<stdlib.h>这个头文件的rand()函数重名了,发生了冲突

那么我们的祖师爷本贾尼是怎么解决的呢?他就提出了使用命名空间这么个域来区分自己的变量和头文件中的变量

首先就是namespace的用法,就以上面的代码为例,如果我想使用rand这个变量名,那我就要这么写:

namespace + 限定域名字{...}

同时,想要访问限定域中的变量,要使用到作用域解析运算符 :: ,这样才能准确找到限定域中的变量

cpp 复制代码
#include<iostream>
#include<stdlib.h>

namespace my_space {
	int rand(int a, int b) {
		return a + b;
	}
}

int main() {
	printf("%p\n", rand);
	printf("%p", my_space::rand);
	return 0;
}

这样一来,编译之后就不会报错了,运行结果如下:

可见,程序这时候就能准确识别出头文件中的函数和我限定域中的函数

这时候就会有人要问了,为什么加上namespace之后就可以使用了?

6.2.2、变量使用方法

我们的程序在寻找变量时,是这样的:

没有限定域时:局部->全局->(如果没找到->报错)

有限定域时:直接在限定域找(使用作用域解析运算符 ::)

因为同一作用域下不能使用同名运算符,不同作用域下可以使用同名运算符

在namespace中,不只有单变量,也可以使用结构体,函数等等,如下代码所示:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>

namespace my_space {
	int rand = 1;


	int add(int a, int b) {
		return a + b;
	}

	typedef struct ListNode {
		int data;
		struct ListNode* next;
	}ListNode;

}

int main() {
	printf("%d\n", my_space::rand);
	printf("%d", my_space::add(1, 7));
	return 0;
}

运行结果如下:

6.2.3、命名空间的嵌套使用

对于命名空间,肯定有人就会问了,主播主播,命名空间中能不能嵌套使用啊?可以的兄弟,可以,对于嵌套使用,我们可以这样子写:

cpp 复制代码
#include<iostream>

namespace my_space {

	namespace my_brother {
		char His_name[20] ="Li Hua";
	}

	namespace my_sister{
		char Her_name[20] = "Xiao Hong";
	}

}

int main() {


	printf("%s\n", my_space::my_brother::His_name);
	printf("%s", my_space::my_sister::Her_name);

	return 0;
}

运行结果如下:

6.2.4、命名空间的使用方法

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。

所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

**1.**指定命名空间访问,项⽬中推荐这种⽅式:
cpp 复制代码
#include<iostream>

namespace my_space {
	int a = 1;
	int b = 2;
}

int main() {

    //这里使用my_space::这样的方式来指定查找的作用域
	printf("%d\n", my_space::a);
	printf("%d", my_space::b);

	return 0;
}

但是这样子有一个弊端就是,每次在使用std或者自定义限定域时,就要一直加上std::或者限定域名字::,很麻烦,有没有好一点的办法呢?有:

2.展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。这种方式就是我们现在刚开始学习使用到的最常用的方式:
cpp 复制代码
#include<iostream>

using namespace std;

int main() {
	
	//cout是std中的函数,这里使用了using将std中的变量全部暴露于全局中,这样就不用每次都写std::了
	cout << "你好" << endl;
	return 0;
}

但是这种方式的缺点就是,会将std中的变量名与自己的变量放在同一作用域中,可能会导致命名冲突的情况发生,那有没有什么这种一点点方法呢?有的兄弟,有的.

**3.**using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
cpp 复制代码
#include<iostream>

//这样就相当于只把cin和cout这两个函数名暴露在全局中
using std::cin;
using std::cout;

int main() {
	int i = 0;
	cin >> i;
	cout << i;
	return  0;
}

小贴士:如果同个命名空间早不同文件中一起使用,系统会自动将多文件的相同命名空间进行合并,并不会当成其他的命名空间.

同时,C++标准库都放在一个叫做std的命名空间中

文章是自己写的哈,有什么描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读~

相关推荐
黎雁·泠崖1 小时前
【魔法森林冒险】11/14 战斗系统(二):多波战斗与BOSS战
java·开发语言
csbysj20203 小时前
PHP Mail - 发送邮件的最佳实践指南
开发语言
jdbcaaa3 小时前
Go 语言 runtime 包的使用与注意事项
开发语言·后端·golang·runtime
ZHOUPUYU5 小时前
PHP 8.3网关优化:我用JIT将QPS提升300%的真实踩坑录
开发语言·php
寻寻觅觅☆9 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
YJlio10 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
fpcc10 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
l1t10 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言