嗨,我是firdawn,今天我们就要开始学习 C++ 了,本章将介绍C++的基础内容,比如C++的发展和namespace的使用,以及C++的输入输出语法和缺省参数,函数重载等概念,为我们以后的学习打下基础。以下是本章的思维导图,那么让我们开始吧!
C++的起源可以追溯到1979年,当时Bjarne Stroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不同的地⽅可能有差异)在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作。⾯对项⽬中复杂的软件开发任务,特别是模拟和操作系统的开发⼯作,他感受到了现有语⾔(如C语⾔)在表达能⼒、可维护性和可扩展性⽅⾯的不⾜。
1983年,Bjarne Stroustrup在C语⾔的基础上添加了⾯向对象编程的特性,设计出了C++语⾔的雏形,此时的C++已经有了类、封装、继承等核⼼概念,为后来的⾯向对象编程奠定了基础。这⼀年该语⾔被正式命名为C++。
在随后的⼏年中,C++在学术界和⼯业界的应⽤逐渐增多。⼀些⼤学和研究所开始将C++作为教学和研究的⾸选语⾔,⽽⼀些公司也开始在产品开发中尝试使⽤C++。这⼀时期,C++的标准库和模板等特性也得到了进⼀步的完善和发展。
C++的标准化⼯作于1989年开始,并成⽴了⼀个ANSI和ISO(International Standards Organization)国际标准化组织的联合标准化委员会。1994年标准化委员会提出了第⼀个标准化草案。在该草案中,委员会在保持斯特劳斯特卢普最初定义的所有特征的同时,还增加了部分新特征。
在完成C++标准化的第⼀个草案后不久,STL(Standard Template Library)是惠普实验室开发的⼀系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室⼯作时所开发出来的。在通过了标准化第⼀个草案之后,联合标准化委员会投票并通过了将STL包含到C++标准中的提议。STL对C++的扩展超出C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,也因此延缓了C++标准化的进程。
1997年11⽉14⽇,联合标准化委员会通过了该标准的最终草案。1998年,C++的ANSI/IS0标准被投入使⽤。
cplusplus C++参考文档_中文版 C++参考文档_英文版 说明:第⼀个链接不是C++官⽅⽂档,标准也只更新到C++11,但是以头⽂件形式呈现,内容⽐较易看 好懂。后两个链接分别是C++官⽅⽂档的中⽂版和英⽂版,信息很全,更新到了最新的C++标准,但是 相⽐第⼀个不那么易看;⼏个⽂档各有优势,我们结合着使⽤。
TIOBE排⾏榜是根据互联⽹上有经验的程序员、课程和第三⽅⼚商的数量,并使⽤搜索引擎(如 Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和Baidu(百度)统计出排名数据,只 是反映某个编程语⾔的热⻔程度,并不能说明⼀⻔编程语⾔好不好,或者⼀⻔语⾔所编写的代码数量 多少。
2026年1⽉TIOBE发布的编程语⾔排⾏榜
C++的应⽤领域服务器端、游戏(引擎)、机器学习引擎、⾳视频处理、嵌⼊式软件、电信设备、⾦融应⽤、基础库、操作系统、编译器、基础架构、基础⼯具、硬件交互等很多⽅⾯都有。
C++是一门相对难学难精通的语言,相比其他语言,学习难度要高要陡峭一些,这里有C++发展历史和C++语言设计本身的问题。不过,如果我们边学边敲代码,将学会的知识点整理成笔记或者博客的形式,可以帮助我们巩固知识点,方便后期的复习,也可以让面试官知道我们原来是有天天在练习代码,学习C++的知识点,面试官就会对你刮目相看,提高面试官对我们的印象。
C++ Primer:主要讲解语法,经典的语法书籍,前后中期都可以看,前期如果⾃学看可能会有点晦涩 难懂,能看懂多少看懂多少,就当预习,学了⽐特课程后,中后期作为语法字典,⾮常好⽤。
STL源码剖析:主要从底层实现的⻆度结合STL源码,庖丁解⽜式剖析STL的实现,是侯捷⽼师的经典 之作。可以很好的帮助我们学习别⼈⽤语法是如何实现出⾼效简洁的数据结构和算法代码,如何使⽤ 泛型封装等。让我们不再坐井观天,闭⻔造⻋,本书课程上⼀半以后,中后期可以看。
Effctive C++:本书也是侯捷⽼师翻译的,本书有的⼀句评价,把C++程序员分为看过此书的和没看过 此书的。本书主要讲了55个如何正确⾼效使⽤C++的条款,建议中后期可以看⼀遍,⼯作1-2年后再看 ⼀遍,相信会有不⼀样的收获。
C++兼容C语言的大部分语法,所以C语言实现的helllo world依旧可以运行,C语言实现文件的后缀为 .c ,VS编译器就会使用C语言编译器编译实现文件,而C++实现文件的后缀为**.cpp** ,cpp是C Plus Plus的英文缩写,编译器看到后缀为**.cpp** 就会知道你写的是C++文件,它就会使用C++编译器编译文件;linux编译C语言文件使用gcc编译器,编译C++文件所以g++编译器编译。
在学习namespace前,我们先来看下图:
为了解决命名冲突的问题,我们的祖师爷本贾尼博士就引入了namespace关键字,我们以后在定义变量时就定义namespace命名空间里面。
namespace定义 :定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后打一对 {} 就可以, {} 中就添加命名空间的成员。命名空间中可以定义变量,函数,类型等。
namespace解决命名冲突的本质是定义出一个域,这个域跟全局域各自独立,不同的域可以就定义同名变量啦。
C++中域有局部域,全局域,命名空间域,类域。域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
namespace只能定义在全局里,不过它还可以嵌套定义。
项目工程中多文件定义的同名namespace会被认为是同一个namespace,不会冲突
C++标准库都放在一个叫std(stdandard)的命名空间中
当然,在namespce中除了定义变量,还能定义函数和类型。
编译查找一个变量的声明或者定义时,默认只会优先在局部查找,然后再在全局里查找,不会到命名空间里面去查找。所以我们要使用命名空间里的成员时一般会用 命名空间名字 + :: 1 + 命名空间成员变量 告诉编译器要到哪里查找变量。
我们要使用命名空间中定义的变量,函数时,有三种方式:
C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。
类型& 引⽤别名 = 引⽤对象;
const引用得到的别名,我们只能对其读,不能写。
C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。
⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就需要建⽴栈帧了,就可以提⾼效率。
inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调 试,C++设计了inline⽬的就是替代C的宏函数。
vs编译器 debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下 以下两个地⽅。
inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地 址,链接时会出现报错。
NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:
作用域限定符(Scope Resolvers) ↩︎
您需要 登录 才可以下载或查看,没有账号?立即注册
使用道具 举报
本版积分规则 发表回复 回帖后跳转到最后一页
荣誉红客
5 小时前
昨天 16:37
昨天 16:26
昨天 10:45
昨天 06:49
中国红客联盟公众号
联系站长QQ:5520533