C++语言学习(一)—— 认识C++语言

目录

一、C++语言

二、C与C++语言的区别

2.1 预处理器

2.2 标准库

2.3 类型

2.4 函数重载

2.5 内存管理

2.6 输入输出函数

2.7 关键字

 三、C++的基本结构


一、C++语言

C++语言是一种高级编程语言,由Bjarne Stroustrup在20世纪80年代初设计和开发。它是C语言的扩展,增加了面向对象编程(OOP)的特性。

以下是C++语言的一些特点:

  1. 面向对象编程(OOP):C++提供了类、对象、继承、多态等OOP的概念和特性,使得代码更易于组织、理解和维护。

  2. 高效性:C++语言的编译和执行速度很快,它能够直接访问硬件和操作系统资源,提供了高度的控制能力。

  3. 泛型编程:C++支持泛型编程,通过使用模板(Template)可以编写可复用的代码,提高开发效率。

  4. 强大的标准库:C++标准库提供了丰富的函数和类,包括容器、算法、输入输出等,使得开发人员可以更轻松地实现各种功能。

  5. 兼容性:C++是C语言的扩展,与C语言兼容,可以直接使用C语言的代码和库。

  6. 可移植性:C++语言可以在不同的操作系统和硬件平台上运行,具有很高的可移植性。

  7. 扩展性:C++语言可以通过添加自定义的类和函数,扩展其功能,满足不同的需求。

总的来说,C++是一种通用的、高性能的编程语言,广泛应用于各种领域,包括游戏开发、嵌入式系统、图形界面等。

二、C与C++语言的区别

2.1 预处理器

1.  C预处理器中的宏定义不支持函数样式的宏,而C++预处理器中可以使用函数样式的宏。例如,下面的代码在C中是不合法的,但在C++中是合法的:

#define MAX(a, b) ((a) > (b) ? (a) : (b))

2.  C预处理器中的字符串化运算符#将参数转换为字符串,但C++预处理器中的字符串化运算符不会转换预定义的宏参数。例如,在C中可以使用以下代码:

#define PRINT(x) printf(#x " = %d\n", x)

但在C++中,上述代码是不合法的。

3.  C预处理器中的条件编译指令#if#elif不支持C++中的const表达式。在C中,条件表达式必须使用宏定义,而在C++中可以使用const变量或枚举常量。例如,在C中,以下代码是合法的:

#define DEBUG_ENABLED
#if DEBUG_ENABLED == 1// ...
#endif

但在C++中,以下代码是合法的:

const int DEBUG_ENABLED = 1;
#if DEBUG_ENABLED// ...
#endif

4.  在C++中,可以使用#include_next指令来包含下一个文件,但在C中不支持该指令。

这些是C和C++预处理器之间一些明显的细节区别,根据具体的编译器和版本,可能会有其他一些细微的区别。

以下是C与C++的预处理器细节的区别表格:

特性C 预处理器(C preprocessor)C++ 预处理器(C++ preprocessor)
宏的定义使用#define关键字定义宏使用#define关键字定义宏
宏的参数只支持简单的变量替换支持函数样式的宏定义,可以使用参数
宏重定义可以用#undef取消宏的定义可以用#undef取消宏的定义
条件编译使用#if#ifdef#ifndef#else#elif#endif进行条件编译使用与C相同的条件编译指令
文件包含使用#include指令包含其他文件使用#include指令包含其他文件
预定义宏有一些预定义宏,如__FILE__(当前文件名)、__LINE__(当前行号)等具有与C相同的预定义宏,如__FILE__(当前文件名)、__LINE__(当前行号)、__DATE__(当前日期)等
内置宏没有内置宏具有一些额外的内置宏,如__cplusplus(定义为C++版本)
字符串化使用#操作符将宏参数转换为字符串形式使用#操作符将宏参数转换为字符串形式
运算符连接使用##操作符可以将两个标识符连接为一个标识符使用##操作符可以将两个标识符连接为一个标识符
可变参数不支持可变参数宏支持可变参数宏
嵌套宏不支持嵌套宏支持嵌套宏
错误处理可以使用#error指令生成编译错误消息可以使用#error指令生成编译错误消息
特殊字符处理特殊字符#在宏中会被替换为字符串化操作符,需要使用##来表示实际的#字符特殊字符#可以直接在宏中使用

需要注意的是,虽然C++的预处理器与C预处理器有一些细节上的差异,但它们的大部分功能和用法是相似的。

2.2 标准库

  1. C标准库:C标准库是C语言的标准库,它提供了一些基本的功能,如输入输出、字符处理、字符串处理、数学函数等。C标准库的函数的命名规则是以"stdio.h"、"stdlib.h"等头文件为主的,函数名往往比较简单,如printf、scanf等。

  2. C++标准库:C++标准库是C++语言的标准库,它不仅包含了C标准库的功能,还提供了更多的功能。C++标准库的函数的命名规则是以"iostream"、"fstream"等头文件为主的,函数名往往比较复杂,如cout、cin等。C++标准库还提供了一些面向对象的功能,如容器、迭代器、算法等。

  3. C++标准库中的容器和算法:C++标准库提供了丰富的容器和算法,如vector、list、set、map等容器,以及sort、search等算法。这些容器和算法可以方便地操作数据,提高编程效率。

  4. C++标准库的命名空间:C++标准库中的函数和类都定义在了std命名空间中,所以使用时需要加上std::前缀。例如,使用cout和cin时要写成std::cout和std::cin。

下面是C和C++语言标准库的一些区别:

C标准库C++标准库
输入输出标准I/O库(如stdio.h),提供了基本的输入输出函数(如printf和scanf)iostream库,提供了更强大和灵活的输入输出能力,通过iostream对象和运算符重载实现
字符串标准字符串库(如string.h),提供了字符串操作函数(如strlen和strcpy)string库,提供了string类,用于处理字符串,并提供了更多的字符串操作功能
数学math库,提供了数学函数(如三角函数、对数函数等)cmath库,提供了数学函数,并以函数模版的方式提供了更多的数学操作功能
内存管理malloc和free函数,用于动态分配和释放内存空间new和delete运算符,用于动态分配和释放内存空间,并提供了更好的内存管理功能
容器N/A提供了各种容器类(如vector、list、map等),用于存储和操作数据
迭代器N/A提供了迭代器,用于遍历容器和访问其中的元素
算法N/A提供了各种算法函数(如排序、查找等),用于对容器中的元素进行操作
异常处理N/A提供了异常处理机制,用于处理程序运行时可能出现的异常
C标准库C++标准库
输入输出stdio.hiostream
字符串string.hstring
数学math.hcmath
文件操作stdio.h, fcntl.hfstream
动态内存stdlib.hcstdlib
时间time.hctime
算法algorithm
容器vector, list, deque, array, map, set, unordered_map, unordered_set, etc.
异常处理exception
多线程pthread.hthread
网络sys/socket.h, netinet/in.h, netdb.h, arpa/inet.h
图形界面Qt, GTK, WinAPI, etc.
正则表达式regex
数据库MySQL, SQLite, etc.
其他功能assert.h, stdarg.h, ctype.h, locale.h, stdbool.h, stdint.h, etc.type_traits, chrono, random, complex, etc.

2.3 类型

C语言和C++之间的类型区别如下:

类型C语言C++
bool不支持支持
char8位有符号整数8位有符号整数
unsigned char8位无符号整数8位无符号整数
short16位有符号整数16位有符号整数
unsigned short16位无符号整数16位无符号整数
int16位或32位有符号整数16位或32位有符号整数
unsigned int16位或32位无符号整数16位或32位无符号整数
long32位有符号整数32位有符号整数
unsigned long32位无符号整数32位无符号整数
long long不支持支持
unsigned long long不支持支持
float32位单精度浮点数32位单精度浮点数
double64位双精度浮点数64位双精度浮点数
long double80位或128位扩展精度浮点数80位或128位扩展精度浮点数
void不返回任何值不返回任何值
enum支持支持
struct支持支持
union支持支持
array支持支持
pointer支持支持
reference不支持支持
class不支持支持
namespace不支持支持

需要注意的是,C++继承了C语言的基本类型,同时还引入了许多新的类型,如bool、long long、reference等。

2.4 函数重载

C语言不支持函数重载,而C++语言支持函数重载。

函数重载是指在同一个作用域中,可以定义多个同名函数,但这些函数具有不同的参数列表。在调用函数时,编译器会根据函数参数的个数、类型或顺序来选择合适的函数进行调用。

在C语言中,如果需要实现类似函数重载的功能,可以使用不同的函数名或不同的参数类型来区分不同的函数。

在C++语言中,函数重载可以实现为函数名相同但参数列表不同的函数。编译器会根据调用时提供的参数来确定调用哪个函数。函数参数的个数、类型或顺序都可以用来进行函数重载。

以下是一个简单的C++函数重载表格例子:

函数名参数1类型参数2类型返回类型
add(int a, int b)intintint
add(double a, double b)doubledoubledouble
add(int a, int b, int c)intintint
add(double a, double b, double c)doubledoubledouble
add(string a, string b)stringstringstring

在上面的表格中,我们定义了名为"add"的函数,并对其进行了重载。根据函数的参数类型和返回类型的不同,我们定义了几个不同版本的"add"函数。、

2.5 内存管理

C语言与C++在内存管理方面有一些细节上的区别。以下是一些主要的区别:

内存管理细节C语言C++
malloc/free使用malloc动态分配内存,使用free释放内存使用new动态分配内存,使用delete释放内存
数组内存管理使用malloc动态分配数组内存,使用free释放数组内存使用new动态分配数组内存,使用delete[]释放数组内存
构造函数和析构函数使用构造函数进行对象的初始化,使用析构函数进行对象的清理
new和delete的功能只能动态分配和释放内存可以动态分配和释放内存,还可以调用构造函数和析构函数
操作符重载不支持支持
异常处理不支持支持
智能指针不支持支持
对象拷贝可以使用memcpy函数进行浅拷贝可以使用拷贝构造函数和赋值运算符进行深拷贝
RAII(资源获取即初始化)不支持支持
内存泄漏容易发生容易避免
内存越界难以检测和避免可以通过使用标准库中的容器来避免
引用计数不支持可以通过使用智能指针来实现
垃圾回收不支持可以通过使用智能指针或垃圾回收器来实现

2.6 输入输出函数

C语言输入输出函数C++输入输出函数
printf()cout <<
scanf()cin >>
puts()cout <<
gets()getline(cin, variable)
putchar()cout <<
getchar()cin.get()
sprintf()stringstream
fscanf()cin >>
fprintf()cout <<
getc()cin.get()
putc()cout <<
fgets()getline(cin, variable)
fputs()cout <<

2.7 关键字

以下是C语言和C++关键字的区别和含义的表格:

关键字C语言C++含义
auto可用可用定义自动存储类的变量
break可用可用结束循环
case可用可用开关语句的标签
char可用可用声明字符类型的变量
const可用可用声明只读变量或只读函数参数
continue可用可用结束当前循环的迭代
do可用可用循环语句开始
double可用可用声明双精度浮点型变量
else可用可用条件语句中的替代分支
enum可用可用枚举类型
extern可用可用声明变量或函数是由外部定义的
float可用可用声明浮点型变量
for可用可用循环语句开始
goto可用可用无条件跳转
if可用可用条件语句开始
int可用可用声明整型变量或函数返回类型
long可用可用声明长整型变量
register可用不可用声明寄存器存储类的变量
return可用可用带返回值的函数结束
short可用可用声明短整型变量
signed可用可用声明有符号类型
sizeof可用可用返回对象或类型的大小
static可用可用声明静态存储类的变量
struct可用可用结构体
switch可用可用开关语句开始
typedef可用可用类型定义
union可用可用联合体
unsigned可用可用声明无符号类型
void可用可用声明无类型或无返回值
volatile可用可用声明易变类型
while可用可用循环语句开始
new不可用可用创建动态内存对象
delete不可用可用删除动态内存对象
throw不可用可用抛出异常
try不可用可用异常处理
catch不可用可用捕获异常
namespace不可用可用命名空间
using不可用可用引入命名空间或标识符

 三、C++的基本结构

C++的基本结构由以下几部分组成:

  1. 注释:可以使用双斜杠(//)进行单行注释,或者使用斜杠加星号(/* ... */)进行多行注释。

  2. 预处理指令:以井号(#)开头的指令,用来在编译前对代码进行处理,如#include用于包含头文件。

  3. 命名空间:用于避免命名冲突,可以使用关键字namespace来定义命名空间。

  4. 函数:用于封装一段可执行的代码块,包括函数头和函数体。可以使用关键字void表示无返回值,或者使用其他数据类型表示有返回值的函数。

  5. 变量:用于存储数据的占位符,需要先声明后使用。可以使用不同的数据类型来定义变量,如int表示整型,float表示浮点型,char表示字符型等。

  6. 表达式:由运算符和操作数组成的代码,用于进行各种数学和逻辑运算。例如,a + b表示加法运算,a > b表示比较大小。

  7. 控制结构:用于控制程序的执行流程,包括条件语句(if-else、switch),循环语句(for、while、do-while)和跳转语句(break、continue、return)等。

  8. 类和对象:用于面向对象编程,将数据和相关操作封装在一起。类定义了对象的属性和方法,对象是类的一个实例。

  9. 数组:用于存储多个相同类型的数据,可以通过索引访问和修改数组元素。

  10. 指针:用于存储变量的地址,可以通过指针来间接访问和修改变量的值。

下面是C++的一个基本结构的典型代码示例:

#include <iostream>// 声明函数
void greet();int main() {// 调用函数greet();// 输出文本std::cout << "Hello, World!" << std::endl;// 返回0表示成功return 0;
}// 定义函数
void greet() {std::cout << "Welcome!" << std::endl;
}

这个代码示例包含了C++程序的一些基本结构:

  1. 头文件引用:#include &lt;iostream> 引用了 iostream 头文件,允许使用输入输出相关的功能。
  2. 函数声明:void greet(); 声明了一个名为 greet 的函数,返回类型为 void,即不返回任何值。
  3. 主函数:int main() 是程序的入口点,返回类型为 int,表示程序的执行状态。在这个示例中,主函数调用了 greet 函数,并输出了一条文本信息。
  4. 输出文本:std::cout &lt;&lt; "Hello, World!" &lt;&lt; std::endl; 使用 std::cout 对象输出了一条文本信息到标准输出流。
  5. 返回值:return 0; 表示程序执行成功,并返回了状态码0。

请注意这只是一个基本的代码示例,C++的语法和结构非常丰富,这里只展示了其中的一小部分。在实际的程序中,可能会包含更多的函数和逻辑。

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

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

相关文章

综合小区管理系统|基于Springboot的综合小区管理系统设计与实现(源码+数据库+文档)

综合小区管理系统目录 目录 基于Springboot的综合小区管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、出入管理 2、报修管理 3、车位管理 4、公告管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#…

git 将某些代码一个分支转移到另一个分支

https://blog.csdn.net/huyongfu2004/article/details/122239102 假设A分支已经有修改的代码 提交过了 但是没有合并到master&#xff1b; 想要吧A分支这次的修改单独提交 已经commit 查看提交的commit号 git log切到新的分支&#xff0c;后将该commit id pick到正确分支 g…

day06、07-MySQL

文章目录 一、MySQL概述1.1 安装1.2 数据模型1.3 SQL简介1.3.1 SQL通用语法1.3.2 分类 二. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库…

【English Learning】Day13

2024/03/14 和小录打卡的第13天 目录 Words & phrases Words & phrases incrredibly incredibly busy 超级忙merely not merely 不仅仅tragedy a terible tregedy 可怕的悲剧a personal tragedy 个人遭遇strive strive to be best 努力做最好的strive for peace 为和平…

【项目管理】进度管理

一、前言 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一个过程&#xff0c;可以由一个人在较短时间内完成。项目管理团队编制进度计划的一般步骤为&#xff1a;首先选择进度计划方法…

Qt+FFmpeg+opengl从零制作视频播放器-7.OpenGL播放视频

在上一节Qt+FFmpeg+opengl从零制作视频播放器-6.视频解码中,我们学到了如何将视频数据解码成YUV原始数据,并且保存到本地,最后使用工具来播放YUV文件。 本节使用QOpenGLWidget来渲染解码后的YUV视频数据。 首先简单介绍QOpenGLWidget的使用。 QOpenGLWidget类是用于渲染O…

HTML—标签的分类,span和div标签,不同的标签之间类型转换

标签的分类&#xff1a; ①块级标签&#xff1a;无论内容多少&#xff0c;会充满整个行。大小可自定义 例&#xff1a;p&#xff0c;h1&#xff0c;ul&#xff0c;ol&#xff0c;hr 等 ②行级标签&#xff1a;自身的大小就是标签的大小&#xff0c;不会占一整行。大小不可调 例…

密码保护小贴士:如何应对常见的网络钓鱼攻击?

网络钓鱼攻击是一种常见的网络欺诈手段&#xff0c;针对个人隐私和财产安全构成威胁。以下是一些密码保护的小贴士&#xff0c;帮助您应对常见的网络钓鱼攻击&#xff1a; 1.谨慎点击链接&#xff1a;收到来历不明的邮件、短信或社交媒体消息时&#xff0c;不要轻易点击其中的…

Python 基础语法:基本数据类型(字典)

为什么这个基本的数据类型被称作字典呢&#xff1f;这个是因为字典这种基本数据类型的一些行为和我们日常的查字典过程非常相似。 通过汉语字典查找汉字&#xff0c;首先需要确定这个汉字的首字母&#xff0c;然后再通过这个首字母找到我们所想要的汉字。这个过程其实就代表了…

easyexcel导出excel文件到s3服务器

导出excel文件是开发中常见的需求 常见的做法一般是直接通过请求接口响应对象HttpServletResponse把文件输出 我们可以使用原生的poi工具类操作.也可以使用easypoi.easyexcel等基于poi二次封装的工具处理 下面是代码 /*** 导出列表** param request* param response*/Overri…

腾讯,百度后端实习一面面经base上海

腾讯面经 拷打后端项目 mysql查询去重怎么建表的项目中一些接口的实现设计场景&#xff1a;抖音有个搜索功能&#xff0c;要搜索并展示用户和视频的信息&#xff0c;你要怎么实现用户的鉴权是怎么设计的设置mysql连接池的参数的依据gorm怎么防止sql注入get和post的区别&#…

SPA富应用开发

1、开发环境的安装&#xff1a; 笔者在安装过程中&#xff0c;出现了版本问题&#xff0c;所以&#xff0c;在这里做出提醒&#xff0c;要是安装不成功&#xff0c;爆出版本问题&#xff0c;执行下面的命令&#xff0c;命令的来源是这里&#xff1a;Install Docker Engine on …

YoloV8改进策略:下采样改进|HWD改进下采样

摘要 本文使用HWD改进下采样&#xff0c;在YoloV8的测试中实现涨点。 论文解读 在卷积神经网络&#xff08;CNNs&#xff09;中&#xff0c;极大池化或跨行卷积等下采样操作被广泛用于聚合局部特征、扩大感受野和最小化计算开销。然而&#xff0c;对于语义分割任务&#xff…

2024年,如何长久做好一家抖音小店?明白这几点就可以了!

大家好&#xff0c;我是电商糖果 有人曾经问过糖果&#xff0c;自己做抖音小店想要长期去玩&#xff0c;可能要做个三四年&#xff0c;甚至更久。 糖果做电商7年了&#xff0c;从2020年开始做抖音小店&#xff0c;现在已经四年了。 所以你如果问我是怎么可以将这个项目做那么…

谷粒商城——分布式基础(全栈开发篇第一部分)

文章目录 一、服务治理网路数据支撑日志处理ELK应用监控集成工具开发工具 二、环境创建1、虚拟机创建2、虚拟机安装docker等1. 安装docker1. 配置阿里docker3.docker安装mysql错误 4、docker安装redis 3、软件1.Maven 阿里云镜像1.8jdk2、idea lombokmybatisX &#xff0c;3、 …

熔断降级的方案实现

熔断降级的方案实现 Spring Cloud Netflix Hystrix 提供线程隔离、服务降级、请求缓存、请求合并等功能可与Spring Cloud其他组件无缝集成官方已宣布停止维护&#xff0c;推荐使用Resilience4j代替 Spring Cloud Resilience4j 轻量级服务熔断库 提供类似于Hystrix的功能 具有更…

C++手写链表、反转链表、删除链表节点、遍历、为链表增加迭代器

本篇博客介绍如何使用C实现链表&#xff0c;首先编写一个简单的链表&#xff0c;然后增加模板&#xff0c;再增加迭代器。 简单链表的实现 链表的结构如下&#xff1a; 首先需要定义链表的节点&#xff1a; struct ListNode {int data;ListNode* pNext;ListNode(int value …

【C++算法模板】图论-拓扑排序,超详细注释带例题

文章目录 0&#xff09;概述1&#xff09;Kahn算法1&#xff1a;数据结构2&#xff1a;建图3&#xff1a;Kanh算法 2&#xff09;DFS染色1&#xff1a;数据结构2&#xff1a;建图3&#xff1a;DFS 3&#xff09;算法对比【例题】洛谷 B3644 推荐视频链接&#xff1a;D01 拓扑排…

JS(一)变量与常量,作用域

JS&#xff08;一&#xff09;变量与常量,作用域 一变量与常量 在JavaScript中&#xff0c;关于变量声明有三种方式&#xff1a;var、let和const&#xff0c;它们之间有一些区别。 01 var 存在变量提升的问题&#xff0c;即变量可以在声明之前被访问。没有块级作用域&#…