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

时间:2024-03-16 18:47:46

目录

一、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.h iostream
字符串 string.h string
数学 math.h cmath
文件操作 stdio.h, fcntl.h fstream
动态内存 stdlib.h cstdlib
时间 time.h ctime
算法 algorithm
容器 vector, list, deque, array, map, set, unordered_map, unordered_set, etc.
异常处理 exception
多线程 pthread.h thread
网络 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 不支持 支持
char 8位有符号整数 8位有符号整数
unsigned char 8位无符号整数 8位无符号整数
short 16位有符号整数 16位有符号整数
unsigned short 16位无符号整数 16位无符号整数
int 16位或32位有符号整数 16位或32位有符号整数
unsigned int 16位或32位无符号整数 16位或32位无符号整数
long 32位有符号整数 32位有符号整数
unsigned long 32位无符号整数 32位无符号整数
long long 不支持 支持
unsigned long long 不支持 支持
float 32位单精度浮点数 32位单精度浮点数
double 64位双精度浮点数 64位双精度浮点数
long double 80位或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) int int int
add(double a, double b) double double double
add(int a, int b, int c) int int int
add(double a, double b, double c) double double double
add(string a, string b) string string string

在上面的表格中,我们定义了名为"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++的语法和结构非常丰富,这里只展示了其中的一小部分。在实际的程序中,可能会包含更多的函数和逻辑。