【C++篇】初识C++

news2024/9/25 19:22:25

友情链接:C/C++系列系统学习目录

知识点内容正确性以C++ Primer(中文版第五版)、C++ Primer Plus(中文版第六版)为标准,同时参考其它各类书籍、优质文章等,总结归纳出个人认为较有逻辑的整体框架,以至减少知识点上的错误,同时方便本人的基础复习,也希望能帮助到大家
 
最好的好人,都是犯过错误的过来人;一个人往往因为有一点小小的缺点,将来会变得更好。如有错漏之处,敬请指正,有更好的方法,也希望不吝提出。最好的生活方式就是和努力的大家,一起奔跑在路上


文章目录

  • 前言
  • 🚀一、C++的起源与发展
  • 🚀二、C和C++的区别
    • ⛳(一)C语言
    • ⛳(二)C++语言
    • ⛳(三)面向对象和面向过程的区别
    • ⛳(四)C和C++的区别
  • 🚀三、C++程序的创建
    • ⛳(一)创建源代码文件
    • ⛳(二)一些常见系统对C++的编译


前言

使用C++的原因之一是为了利用其面向对象的特性。要利用这种特性,必须对标准C语言知识有较深入的了解,因为它提供了基本类型、运算符、控制结构和语法规则。所以,如果已经对C有所了解,便可以学习C++了,

  • 如果先掌握了C语言,则在过渡到C++时,必须摈弃一些编程习惯。

    (这是我打算在C++篇总结的第一部分,主要归纳整理一些与C语言基本知识上的区别,有些语法上的差别以及C++中新增的一些基础知识点:默认参数、异常机制、强类型检查机制等等)

    学习C语言:C/C++系列系统学习目录

  • C++的类和对象的相关知识点

    (这是我打算在C++篇总结的第二部分)

  • C++的泛型编程STL

    (这是第三部分)

🚀一、C++的起源与发展

C++的历史可以追溯到1979年,当时 Bjarne Stroustrup正在做他的博士论文,并且能够使用的唯一一种编程语言就是Simula(一种用来进行仿真的编程语言)。Simula67是公认为的第一种面向对象的编程语言,在使用过程中,Stroustrup发现使用面向对象的方法进行软件开发有很多益处,但Simula语言太过笨重,不适用于实际应用。正是出于这个原因,Stroustrup开始对C语言进行改进,在C语言的基础上添加了类、基本的继承、内联、默认参数和强类型检查机制,并且尽可能的保持C语言的性能。

1980年,C++的早期版本诞生,称作带类的C(C with Classes)。

1983年,C++语言正式出现了。C++使用的爆炸式增长。传统的面向用户遇到的问题及基于同事间讨论的演化方式已无法满足需求,迫切需要对C++语言进行标准化。1989年,《The Annotated C++ Reference Manual》发布,成为C++标准的基础。同年12月,ANSI的X3J16委员会成立并在华盛顿召开第一次技术会议,ANSI C++标准的制定开始提上日程。1991年7月ANSI C++标准化成为ISO标准化工作的一部分。1995年4月,C++标准草案提交公众审阅,1998年ISO C++标准通过ISO评审成为国际标准,称作C++98,之所以称之为C++是取自++操作符在C中的寓意,代表C++是在C基础之上发展起来的。与此同时,在C++中又加入了很多特征,包括:重载、引用、‘const’关键字、单行注释(从BCPL中借鉴来的)等等。

2003年,C++标准委员会对C++98中的问题进行了修订,发布了C++03版本,该版本并没有对核心语言进行修改。

2011年,新的C++标准C++11面世,增加了多线程支持、通用编程支持等,标准库也有很多变化,集成了C++技术报告1库(TR1)中的大部分内容。

2014年12月,C++ ISO/IEC标准的最新版本C++14。C++14是对C++11的小范围的扩展,主要内容是修复bug和略微提高性能。

2017年12月,ISO C++ 委员会正式发布了 C++ 17 标准,官方名称为 ISO/IEC 14882:2017。基于 C++ 14,C++ 17 旨在使 C++ 成为一个不那么臃肿复杂的编程语言,以简化该语言的日常使用,使开发者可以更简单地编写和维护代码。C++ 17 是对 C++ 语言的重大更新,引入了许多新的语言特性

img

C++语言发展大概可以分为三个阶段:

第一阶段

从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;

第二阶段

从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;

第三阶段

从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

🚀二、C和C++的区别

⛳(一)C语言

一般来说,计算机语言要处理两个概念——数据和算法。数据是程序使用和处理的信息,而算法是程序使用的方法

  1. C语言是过程性语言

C语言与当前最主流的语言一样,在最初面世时也是过程性(procedural)语言,这意味着它强调的是编程的算法方面。通俗解释就是:当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。

  1. C语言是结构化语言

早期的程序语言(如FORTRAN和BASIC)都会遇到组织方面的问题。例如,程序经常使用分支语句,根据某种测试的结果,执行一组或另一组指令。很多旧式程序的执行路径很混乱(被称为“意大利面条式编程”),几乎不可能通过阅读程序来理解它,修改这种程序简直是一场灾难。为了解决这种问题,计算机科学家开发了一种更有序的编程方法——结构化编程(structured programming)。C语言具有使用这种方法的特性。例如,结构化编程将分支(决定接下来应执行哪个指令)限制为一小组行为良好的结构。C语言的词汇表中就包含了这些结构(for循环、while循环、do while循环和if else语句)。

  1. C语言的理念是自顶向下的设计理念

在C语言中,其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则将它分解为更小的任务。这一过程将一直持续下去,直到将程序划分为小型的、易于编写的模块(整理一下书房。先整理桌子、桌面、档案柜,然后整理书架。好,先从桌子开始,然后整理每个抽屉,从中间的那个抽屉开始整理。也许我都可以管理这项任务)。C语言的设计有助于使用这种方法,它鼓励程序员开发程序单元(函数)来表示各个任务模块。

⛳(二)C++语言

  1. 面向对象编程(OOP)

虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但它在编写大型程序时,仍面临着挑战。为应付这种挑战,OOP提供了一种新方法。与强调算法的过程性编程不同的是,OOP强调的是数据与方法。通俗解释就是:当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。

三大特征:

  • 封装:将客观事物封装成抽象的类,而类可以把自己的数据和方法暴露给可信的类或者对象,对不可信的类或对象则进行信息隐藏
  • 继承:可以使用现有类的所有功能,并且无需重新编写原来的类即可对功能进行拓展;
  • 多态:一个类实例的相同方法在不同情形下有不同的表现形式,使不同内部结构的对象可以共享相同的外部接口。
  1. 泛型编程(STL:标准模板库)

泛型编程(generic programming)是C++支持的另一种编程模式。C++的数据表示有多种类型——整数、小数、字符、字符串、用户定义的、由多种类型组成的复合结构。例如,要对不同类型的数据进行排序,通常必须为每种类型创建一个排序函数。泛型编程需要对语言进行扩展,以便可以只编写一个泛型(即不是特定类型的)函数,并将其用于各种实际类型。C++模板提供了完成这种任务的机制。

⛳(三)面向对象和面向过程的区别

例子:

问题: 洗衣机里面放有脏衣服,怎么洗干净?

面向过程的解决方法:

1、执行加洗衣粉方法;

2、执行加水方法;

3、执行洗衣服方法;

4、执行清洗方法;

5、执行烘干方法;

以上就是将解决这个问题的过程拆成一个个方法(是没有对象去调用的),通过一个个方法的执行来解决问题。

面向对象的解决方法:

1、我先弄出两个对象:“洗衣机”对象和“人”对象

2、针对对象“洗衣机”加入一些属性和方法:“洗衣服方法”“清洗方法”、“烘干方法”

3、针对对象“人”加入属性和方法:“加洗衣粉方法”、“加水方法”

4、然后执行

人.加洗衣粉

人.加水

洗衣机.洗衣服

洗衣机.清洗

洗衣机.烘干

解决同一个问题 ,面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题。

⛳(四)C和C++的区别

C和C++的主要区别在于C是过程式编程语言,不支持类和对象,而C++是过程式和面向对象编程语言的结合;因此C++可以被称为混合语言。

CC++
C 由丹尼斯·里奇 (Dennis Ritchie) 于 1969 年至 1973 年在 AT&T 贝尔实验室开发。C++ 由 Bjarne Stroustrup 于 1980 年与 C++ 的前身“C with Classes”一起开发。
与 C++ 相比,C 是 C++ 的子集。C++是C的超集。C++可以运行大部分C代码,而C不能运行C++代码。
C 支持用于代码开发的过程式编程范式。C++ 支持面向过程和面向对象的编程范式;因此C++也被称为混合语言。
C 不支持面向对象编程;因此它不支持多态、封装和继承。作为一种面向对象的编程语言,C++ 支持多态、封装和继承。
在 C 中(因为它是一种过程编程语言),数据和函数是独立且自由的实体。在C++中(当它用作面向对象的编程语言时),数据和函数以对象的形式封装在一起。为创建对象类提供了对象结构的蓝图。
在 C 中,数据是自由实体,可以由外部代码操作。这是因为 C 不支持信息隐藏。在 C++ 中,封装隐藏数据以确保按预期使用数据结构和运算符。
C,作为过程式编程,它是一种函数驱动的语言。而C++作为一种面向对象的编程,它是一种对象驱动的语言。
C 不支持函数和运算符重载。C++ 支持函数和运算符重载。
C 不允许在结构内部定义函数。在 C++ 中,函数可以在结构内部使用。
C 没有命名空间功能。C++ 使用 NAMESPACE 来避免名称冲突。命名空间是一个声明性区域,为其中的标识符(类型、函数、变量等的名称)提供范围。命名空间用于将代码组织成逻辑组并防止可能发生的名称冲突,尤其是当您的代码库包含多个库时。命名空间范围内的所有标识符彼此可见,无需限定。命名空间之外的标识符可以通过使用每个标识符的完全限定名称来访问成员。
C 使用函数进行输入/输出。例如scanfprintfC++ 使用对象作为输入输出。例如cincout
C 不支持引用变量。C++ 支持引用变量。
C 不支持虚拟和友元函数。C++ 支持虚函数和友元函数。
C提供malloc()calloc()用于动态存储器分配的功能,并free()为存储器解除分配。C++ 提供new了内存分配delete操作符和内存释放操作符。
C 不直接支持错误处理(也称为异常处理)C++ 提供对异常处理的支持。异常用于使代码不正确的“硬”错误。

C++对C的“增强”,表现在六个方面:

(1) 类型检查更为严格。

(2) 增加了面向对象的机制。

(3) 增加了泛型编程的机制(Template)。

(4) 增加了异常处理。

(5) 增加了运算符重载。

(6) 增加了标准模板库(STL)。

🚀三、C++程序的创建

⛳(一)创建源代码文件

有些C++实现提供了集成开发环境,能够在主程序中管理程序开发的所有步骤,包括编辑。有些实现(如用于UNIX和Linux的GNU C++)只能处理编译和链接阶段,要求在系统命令行输入命令。在这种情况下,可以使用任何文本编辑器来创建和修改源代码。例如,在UNIX系统上,可以使用vi、ed、ex或emacs;在以命令提示符模式运行的Windows系统上,可以使用edlin、edit或任何程序编辑器。

后缀名:

注意区别的是C++源文件的后缀名:使用什么扩展名取决于C++实现,一般来说.C是C语言的源文件,.CPP是C++语言的源文件

环境后缀名
UNIX(区分大小写,C源文件用小写c,C++源文件用大写C)C、cc、cxx、c
GNU C++C、cc、cxx、cpp、c++
Digital Marscpp、cxx
Borland C++cpp
Watcomcpp
Microsoft Visual C++cpp、cxx、cc
Freestyle CodeWarriorcp、cpp、cc、cxx、c++

⛳(二)一些常见系统对C++的编译

1.UNIX编译和链接

最初,UNIX命令CC调用cfront编译器,但cfront未能紧跟C++的发展步伐,其最后一个版本发布于1993年。当今的UNIX计算机可能没有编译器、有专用编译器或第三方编译器,这些编译器可能是商业的,也可能是自由软件,如GNU g++编译器。如果UNIX计算机上有C++编译器,很多情况下命令CC仍然管用,只是启动的编译器随系统而异。出于简化的目的,读者应假设命令CC可用,但必须认识到这一点,即对于下述讨论中的CC,可能必须使用其他命令来代替。

用CC命令来编译程序。名称采用大写字母,这样可以将它与标准UNIX C编译器cc区分开来

CC spiffy.C

2.Linux编译和链接

gcc是GCC中的GUN C Compiler(C 编译器)

g++是GCC中的GUN C++ Compiler(C++编译器)

C语言中用gcc,C++中用g++:

gcc inform.c  //也可用cc
g++ inform.cpp 

3.Windows命令行编译器

要在Windows PC上编译C++程序,最便宜的方法是下载一个在Windows命令提示符模式(在这种模式下,将打开一个类似于MS-DOS的窗口)下运行的免费命令行编译器。Cygwin和MinGW都包含编译器GNU C++,且可免费下载;它们使用的编译器名为g++。


行文至此,落笔为终。文末搁笔,思绪驳杂。只道谢不道别。早晚复相逢,且祝诸君平安喜乐,万事顺意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

E. Tracking Segments - 二分+前缀和

分析&#xff1a; 记录所有区间和给定的每一次的询问&#xff0c;二分询问的最小满足条件&#xff0c;可以通过前缀和来计算区间内有几个1。 代码&#xff1a; #include <bits/stdc.h>#define x first #define y secondusing namespace std;typedef long long ll; type…

​面试官疯了:while(true)和for(;;)哪个性能好?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 427 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; while(true)和for(;;)都是做无限循环的代码&#xff0c;他俩有啥区别呢&#xff1f; 我承认这个问题有点无聊&#…

四、Docker镜像

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、Docker镜像1.1 概念1.2 UnionFS&#xff08;联合文件系统&#xff09;1.3 Docker镜像加载原理1.4 重点理解 二、docker commit 命令2.1 是什么&#xff1f;2.2 命令…

走进人工智能|机器学习 解码未来的科技革命

前言: 机器学习的发展为我们提供了更智能、高效和便捷的科技产品和服务&#xff0c;可以改善我们的生活和工作方式。 文章目录 序言背景解码未来的科技革命技术支持应用领域程序员如何学总结 序言 机器学习是一种人工智能领域的技术&#xff0c;它让计算机通过数据自动地学习和…

folium离线地图使用

几点说明&#xff1a; 1. 代码亲测有效&#xff08;效果见文末图&#xff09; 2. 离线使用&#xff0c;需要预先下载png格式的离线地图&#xff0c;这里以OpenStreetMap为例。 3. 离线地图下载工具&#xff1a;Offline Map Maker https://www.allmapsoft.com/omm/ 4. foliu…

赋予女性力量:在 Web3 和元宇宙中释放新的机会

Web3 和元宇宙的出现引发了数字领域的革命&#xff0c;为全世界的用户带来了更多可能性。这一转变的其中一个重要方面是赋予女性权力&#xff0c;因为她们更踊跃参与元宇宙活动&#xff0c;并利用 Web3平台挑战传统边界。 The Sandbox 非常自豪能够开放、具包容性地为 womenint…

Swing如何使用?几个操作示例教会你!

以下是四个使用 Swing 组件创建的示例代码&#xff1a; 示例一&#xff1a;JFrame JFrame 是一个顶级容器&#xff0c;用于创建框架窗口。下面是一个简单的 JFrame 示例&#xff1a; import javax.swing.JFrame;/*** author: Ajie* create: 2023/6/21* Description:* FileNa…

OpenStack(1)-创建实例

目录 一、上传镜像 1.1 新建目录 1.2 上传至glance 1.3 查看镜像 二、新建实例 2.1 获取秘钥 2.2 新建实例 2.3 新建实例admin-vm 2.4 获取实例VNC的url 2.5 nova常用命令 一、上传镜像 1.1 新建目录 上传名为cirros-0.3.4-x86_64-disk.img的Linux测试镜像&#xf…

JdbcTemplate 数据访问工具

文章目录 前言JdbcTemplate 数据访问工具1. 概述2. 主要功能3. 示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

新时代的黑科技:就凭这个,还真就非JNPF低代码不可了

随着技术的不断进步&#xff0c;现代企业对软件开发的需求越来越迫切&#xff0c;传统的软件开发方式已无法满足快速迭代和创新的需求。在这种情况下&#xff0c;低代码开发平台应运而生。低代码开发平台通过提供可视化的开发工具和预构建的组件&#xff0c;大大加快了应用程序…

Docker的安装部署以及配置的操作流程(图文)

Docker的安装以及配置流程&#xff08;图文&#xff09; Docker一、配置域名解析二、CentOS Docker 安装1. 查询已安装的docker2. 安装必要的一些系统工具3. 添加软件源&#xff08;阿里云&#xff09;信息4. 更新并安装Docker-CE5. 查看docker 的版本6. 关闭运行的防火墙7. 开…

CMake 工程实践指南专栏介绍

CMake 工程实践指南专栏介绍 大家好,我是 eg,欢迎来到我的 CMake 工程实践指南专栏。本专栏会保持一周一更的节奏,带大家从一个 CMake 小白蜕变成 CMake 熟练使用者。 1. 我与 CMake 的故事 在正式内容开始之前,我想谈谈我和 CMake 的故事。我读书的时候是压根儿不知道 …

造手机、“+ AI”,掉队的蔚来瞎折腾?

对标豪华品牌BBA&#xff0c;自建换电站&#xff0c;蔚来汽车曾凭借先发优势&#xff0c;一度成为造车新势力的领头羊&#xff0c;但最近两个月&#xff0c;蔚来的单月交付量仅有6000多台&#xff0c;渐露掉队之相。 主业低迷&#xff0c;蔚来传出新消息。两天前&#xff0c;工…

c++lambda函数笔记

1、labmda函数用途&#xff1a; 用于简短功能函数的定义&#xff0c;并传递到std算法中。 2、一般函数与lambda函数比较示例 3、如何定义lambda 如下为lambda通用定义式子&#xff1a; [capture] (params) opt->ret{body;}; capture——捕获列表&#xff0c;[]为不捕获变量…

JAVA线程池submit详解 ,execute和submit提交任务的区别

文章目录 前言submit方法定义Future是什么execute、submit方法区别是什么submit主干流程逻辑newTaskFor做了什么FutureTasknewTaskFor(Runnable runnable, T value)的实现FutureTask(Callable<V> callable)的实现execute(ftask) FutureTask是如何实现线程池执行可获取返回…

java多线程简明笔记(5)线程礼让 yield

关键字&#xff1a;yield 官方文档就不说了&#xff0c;简单理解&#xff0c;礼让 线程礼让 yield正在执行的线程暂停&#xff0c;不阻塞 示例代码&#xff1a; public class ThreadTest7 implements Runnable{public static void main(String[] args) {ThreadTest7 tnew Th…

在线广告业务流程

一、业务流程 1、注册/登录 广告主登录系统&#xff0c;进行基本的鉴权&#xff0c;角色分配&#xff0c;账户管理。同时为营销参与者包括产品、运营、销售等提供登录、附身功能。 2、代理开户 & 订单合同管理 代理商可代理广告主开户&#xff0c;客户同样统一维护在用户…

帮你解锁 Android 性能优化五大误区和两大疑点!

近年来&#xff0c;社区充斥着关于 Android 性能优化的各种误区&#xff0c;本文本着误区终结者的精神&#xff0c;使用具体的性能检测工具&#xff0c;结合真实案例仔细分析这些情况&#xff0c;并对比它们的测试结果&#xff0c;也会聚焦 Android 开发者平时在编码过程的实际…

【CV 向】OpenCV 图形绘制指南

文章目录 引言1. 创建画布2. 绘制线段3. 绘制矩形4. 绘制圆5. 绘制椭圆6. 绘制多边形7. 绘制字体结论 引言 Python OpenCV 是一个功能强大的计算机视觉库&#xff0c;除了图像处理和计算机视觉任务外&#xff0c;它还提供了丰富的功能来绘制各种图形。无论是在计算机视觉应用中…

基于ChatGPT的端到端语音聊天机器人项目实战(三)

企业级ChatGPT开发入门实战 第1课 基于ChatGPT的端到端语音聊天机器人项目实战 Gavin老师:NLP_Matrix_Space 1.4 使用FastAPI构建语音聊天机器人后端实战 在后端代码(backend)中调用了OpenAI API及其他的服务,如图1-10所示。 图1- 10 后端代码调用OpenAI API openai_requ…