目录
C++基础入门
C++ 简介
C++的特点
标准库
ANSI 标准
学习 C++
C++ 的使用
标准化
从C到C++
解读第一个C++程序
什么是命名空间?
C++ 标识符
C++ 关键字
三字符组
C++中的输入输出
注释
C++基础入门
C++ 简介
C++是一种通用的、高级的编程语言,它扩展自C语言,并添加了面向对象编程(OOP)的特性。C++由Bjarne Stroustrup于20世纪80年代初开发,旨在提供一个更强大和灵活的编程语言,适用于广泛的应用领域。
C++的特点
1. 面向对象编程:C++支持面向对象编程范式,允许开发者使用类、对象、封装、继承、多态、抽象等概念来组织和管理代码,以提高代码的可重用性、可维护性和可扩展性。
2. 高性能:C++是一种底层语言,可以直接访问计算机硬件,提供了对内存和计算资源的精细控制,因此具有很高的执行效率和速度。这使得C++在开发需要高性能的应用程序时非常有优势,如游戏引擎、图形处理和科学计算等领域。
3. 通用性:C++是一种通用编程语言,可以应用于各种不同的领域和平台,例如桌面应用程序、嵌入式系统、服务器端开发等。C++的标准库提供了丰富而强大的功能,包括容器、算法、输入输出等,使开发者能够快速构建复杂的应用程序。
4. 扩展性:C++支持面向对象和面向过程的编程风格,同时还提供了一些高级特性,如模板、泛型编程等,可以在不牺牲性能的情况下实现代码的灵活性和重用性。这使得C++成为一种非常强大的语言,能够满足各种不同的编程需求。
5. 社区支持:C++是一种广泛使用的编程语言,在全球范围内有大量的开发者和社区积极参与其中。这意味着可以轻松获取到大量的学习资源、工具和库,以及分享经验和解决问题的机会。
总之,C++是一种功能强大、灵活且通用的编程语言,适用于各种不同的应用领域。它的高性能和扩展性使其成为许多开发者首选的语言之一。然而,由于其复杂性和学习曲线较陡,它对于初学者来说可能会有一定的挑战性。
标准库
C++标准库是一组提供了常用功能和数据结构的库,它是C++编程语言的一部分,并由标准委员会定义和规范化。C++标准库分为两个主要部分:标准模板库(Standard Template Library,STL)和输入输出流库(Input/Output Stream Library)。
标准模板库(STL):
- 容器(Containers):包括向量(vector)、链表(list)、队列(queue)、栈(stack)等数据结构,提供了各种操作和算法。
- 算法(Algorithms):提供了排序、查找、遍历等各种算法操作,如排序算法(sort)、查找算法(find)等。
- 迭代器(Iterators):提供了一种统一的方式来访问容器中的元素,可以实现泛型编程。
- 函数对象(Function Objects):允许将函数作为参数传递给算法,具有更高的灵活性。
- 其他组件:如数值处理(numeric)、字符处理(string)等。
输入输出流库:
- 输入流(istream):用于从标准输入设备或文件中读取数据。
- 输出流(ostream):用于向标准输出设备或文件中写入数据。
- 文件流(fstream):用于读写文件。
- 字符串流(stringstream):用于在内存中操作字符串。
标准库提供了丰富而强大的功能,使得开发者能够快速、高效地处理数据、进行输入输出操作以及实现各种常用算法。使用标准库可以减少开发工作量,提高代码的可重用性和可维护性。此外,C++标准库还包括其他组件,如日期时间处理、随机数生成、异常处理等,以满足不同应用场景的需求。
要使用标准库,只需包含相应的头文件并调用所需的函数或对象即可。例如,要使用向量容器,可以包含<vector>头文件,然后使用std::vector类来创建和操作向量。类似地,要使用输入输出流库,可以包含<iostream>头文件,然后使用std::cout和std::cin等对象进行输入输出操作。
总而言之,C++标准库是一组提供了常用功能和数据结构的库,它包括STL和输入输出流库,可以帮助开发者更轻松地处理数据、进行输入输出操作以及实现各种常用算法。它是C++编程中不可或缺的重要组成部分。
ANSI 标准
ANSI标准是指由美国国家标准学会(American National Standards Institute,简称ANSI)发布的标准。在C++中,ANSI标准通常用来指代ISO/IEC 14882标准,该标准定义了C++编程语言的规范。
ISO/IEC 14882标准规定了C++的语法、语义、库以及其他相关方面的规范。该标准由国际标准化组织(ISO)和国际电工委员会(IEC)联合制定,并于1998年首次发布。之后,该标准进行了多次修订和更新,最新版本为ISO/IEC 14882:2020,也被称为C++20。
ANSI标准的发布对于C++的发展和标准化起到了重要作用。C++的不同编译器和开发环境在遵循ANSI标准的同时,还可能实现一些扩展和特定功能。因此,在编写C++代码时,开发者通常会遵循ANSI标准,以确保代码的可移植性和兼容性。
需要注意的是,虽然C++标准通常使用ANSI标准来描述,但并不意味着该标准仅适用于美国。事实上,C++编程语言是一种国际化的语言,被广泛应用于全球范围的软件开发中。因此,ANSI标准实际上是一种国际标准,被全球的C++开发者所采纳和遵循。
学习 C++
学习C++需要理解其基本概念和编程范式,而不是过于深究语言的技术细节。以下是一些建议:
- 理解 C++ 的基本概念:C++ 是一种面向对象编程语言,也支持泛型编程。因此,您需要理解类、对象、继承、多态、模板等基本概念。
- 学习 C++ 的编程范式:C++ 支持多种编程范式,包括面向对象编程、泛型编程、函数式编程等。您需要了解这些范式的基本思想和应用场景,并根据实际需求选择合适的范式进行编程。
- 练习编程:C++ 编程需要通过实践来掌握。您可以尝试使用 C++ 编写简单的代码,并运行和调试它们。随着经验的积累,您可以逐渐提高自己的编程水平。
- 使用开发工具:为方便编写、测试和调试 C++ 代码,您可以选择一款适合自己的集成开发环境(IDE)。常见的 C++ 开发环境有 Visual Studio、Eclipse 等,您可以根据自己的需求选择适合自己的开发环境。
- 参考资料:除了教程和书籍之外,还可以查阅官方文档、参考手册和博客等资料,以了解 C++ 标准库和常用库的使用方法。这些资料可以帮助您更加高效地编写代码。
总之,学习 C++ 需要不断地实践和学习,只有通过不断积累经验和知识,才能成为一名熟练的 C++ 程序员。
C++ 的使用
C++ 是一种功能强大的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统等领域。下面是一些常见的 C++ 使用场景和应用:
-
系统软件开发:C++ 可以用于开发操作系统、编译器、数据库管理系统等底层软件。它的高性能和直接与硬件交互的能力使其成为构建高效系统软件的首选语言。
-
游戏开发:C++ 在游戏开发领域非常流行。许多游戏引擎和框架,如Unity、Unreal Engine等,都是使用 C++ 编写的。C++ 提供了对底层硬件的直接控制,可以实现高性能和复杂的游戏逻辑。
-
嵌入式系统开发:C++ 在嵌入式系统的开发中也得到广泛应用。通过使用 C++,可以方便地操作硬件,编写驱动程序和嵌入式应用程序,如嵌入式控制器、智能家居设备等。
-
科学计算和数值计算:C++ 提供了丰富的数学库和算法支持,使其成为进行科学计算和数值模拟的理想选择。许多科学计算软件,如MATLAB、OpenCV等,都是使用 C++ 编写的。
-
高性能计算:C++ 的强大性能和底层控制能力使其在高性能计算领域得到广泛应用。通过使用 C++,可以编写高效的并行计算代码,如利用多核处理器进行并行计算、使用CUDA编写GPU加速应用程序等。
-
金融领域:C++ 在金融领域中被广泛应用,如高频交易、算法交易和风险管理等领域。由于这些应用程序需要高效的性能和对硬件的直接控制,C++ 语言是一个合适的选择。
-
网络编程和服务器开发:C++ 提供了丰富的网络编程库和框架,如 Boost.Asio、Poco 等,使其成为构建高性能服务器和网络应用的首选语言。C++ 的高效性能和底层控制能力可以帮助开发者编写高效的并发和分布式网络应用程序。
-
图形图像处理:C++ 可以用于开发图形和图像处理应用程序,如计算机视觉、计算机图形学和人工智能领域。由于这些应用程序需要高效的计算能力和对硬件的控制,因此 C++ 是一个很好的选择。
总体而言,C++ 是一种非常灵活和强大的编程语言,适用于各种不同的应用场景。无论您是开发系统软件、游戏、嵌入式系统还是进行科学计算,C++ 都可以提供高性能和底层控制的能力,帮助您实现复杂的功能和任务。
标准化
| 发布时间 | 通称 | 备注 |
|---|---|---|
| 2020 | C++20, C++2a | ISO/IEC 14882:2020 |
| 2017 | C++17 | 第五个C++标准 |
| 2017 | coroutines TS | 协程库扩展 |
| 2017 | ranges TS | 提供范围机制 |
| 2017 | library fundamentals TS | 标准库扩展 |
| 2016 | concurrency TS | 用于并发计算的扩展 |
| 2015 | concepts TS | 概念库,用于优化编译期信息 |
| 2015 | TM TS | 事务性内存操作 |
| 2015 | parallelism TS | 用于并行计算的扩展 |
| 2015 | filesystem TS | 文件系统 |
| 2014 | C++14 | 第四个C++标准 |
| 2011 | - | 十进制浮点数扩展 |
| 2011 | C++11 | 第三个C++标准 |
| 2010 | - | 数学函数扩展 |
| 2007 | C++TR1 | C++技术报告:库扩展 |
| 2006 | - | C++性能技术报告 |
| 2003 | C++03 | 第二个C++标准 |
| 1998 | C++98 | 第一个C++标准 |
从C到C++
C++ 是在 C 语言的基础上进行扩展和增强而来的,它保留了 C 语言的特性,并引入了面向对象编程的概念和其他功能。而面向对象在C++中的体现就是类的机制,所以C++也称作是“带类的C语言的”。
我们不妨先从C语言的结构体说起,比如C语言代码:
struct stu
{
int num;
char sex;
int math_score;
int en_score;
int c_score;
};
int main()
{
struct stu A;
return 0;
}
这段代码定义了一个结构体(struct),结构体名为 "stu"。结构体包含了学生的学号(num)、性别(sex)和数学、英语、C语言三门课程的成绩(math_score、en_score、c_score)。
在 main 函数中,定义了一个名为 A 的结构体变量,通过该结构体变量可以访问并操作结构体中的成员变量。
这种方式常用于将多个相关的数据项组合在一起,形成一个自定义的数据类型。可以通过定义结构体变量来访问和修改结构体成员变量的值。
对应的C++代码则为:
class stu
{
int num;
char sex;
int math_score;
int en_score;
int c_score;
int total_score()
{
return math_score+en_score+c_score;
};
};
int main()
{
class stu A;
return 0;
}
这段代码定义了一个类(class),类名为 "stu"。类包含了学生的学号(num)、性别(sex)和数学、英语、C语言三门课程的成绩(math_score、en_score、c_score)。
在类中,还定义了一个私有成员函数 total_score(),用于计算学生的总分数。该函数只能在类的内部被调用。
在 main 函数中,定义了一个名为 A 的类对象,通过该对象可以访问并操作类中的成员变量和成员函数。
大家仔细对比看看,C语言里用struct定义,C++用class定义。与结构体不同,类除了可以包含成员变量,还可以包含成员函数。类的成员函数可以是公有(public)、私有(private)或保护(protected)的。公有成员函数可以被类的外部访问和调用,而私有和保护成员函数只能在类的内部被访问和调用。
所以类是 C++ 中重要的概念之一,可以实现面向对象编程(OOP),提高代码的可重用性、可维护性和可扩展性。
解读第一个C++程序
请看代码:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
这个程序执行后的效果就是在屏幕上打印Hello, world!这句话。
也可以用 "\n" 代替以上代码里的 endl。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << "\n";
return 0;
}
接下来我们讲解一下上面这段程序:
首先,程序包含了头文件 iostream,该文件中定义了输入输出流对象 cin 和 cout,以及其他与流相关的函数和类。本程序使用了命名空间 std,以便直接使用 std::cout 和 std::endl。
在 main 函数中,使用 cout 对象输出 "Hello, world!" 字符串,并在字符串末尾添加换行符 endl。最后,返回整数值 0,表示程序正常退出。
该程序非常简单,但是它包含了 C++ 程序的基本结构,包括头文件、命名空间、main 函数、输出语句和返回值。
什么是命名空间?
命名空间(namespace)是 C++ 中的一个重要概念,它用于组织和管理代码中的标识符(如变量、函数、类等)。
在 C++ 中,命名空间可以被理解为一个逻辑上的容器,用来将一组相关的标识符进行分组,以避免命名冲突。通过将标识符放置在命名空间中,可以限定其作用范围,使得不同命名空间中的相同名称的标识符互不干扰。
1、命名空间可以包含其他命名空间、变量、函数、类等。它的语法形式如下:
namespace namespace_name {
// 声明或定义标识符
}
例如:
namespace my_namespace {
int x;
void foo() {
// 函数定义
}
class MyClass {
// 类定义
};
}
2、使用命名空间时,可以通过命名空间名加上作用域解析操作符 :: 来访问其中的成员。例如,假设有一个命名空间 my_namespace,其中定义了一个函数 myFunction(),可以通过以下方式调用该函数:
my_namespace::myFunction();
例如:
my_namespace::x = 42;
my_namespace::foo();
my_namespace::MyClass obj;
为了简化代码,可以使用 using 关键字来引入命名空间中的特定标识符:
using my_namespace::x;
using my_namespace::foo;
using my_namespace::MyClass;
然后就可以直接使用这些标识符,而无需再添加命名空间限定符:
x = 42;
foo();
MyClass obj;
3、如果在程序中使用了命名空间,可以使用 using 关键字进行全局引入,以便在代码中直接使用命名空间中的标识符,而无需每次都使用完整的命名空间限定符。
例如:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
需要注意的是,在实际编程中,为了避免潜在的命名冲突,应该谨慎使用 using 语句引入整个命名空间,而更倾向于在需要使用某个特定标识符时,使用限定符来明确指定命名空间。
C++ 标识符
在C++中,标识符是用来命名变量、函数、类、对象等程序实体的名称。标识符必须遵循以下规则:
- 标识符可以由字母(大写或小写)、数字和下划线 _ 组成,但必须以字母或下划线开头。
- 标识符区分大小写,因此 myVar 和 myvar 是不同的标识符。
- C++关键字(如 int、if、while 等)不能用作标识符。
- 标识符长度没有限制,但应保持合理,易于理解。
- 推荐使用有意义的名称,能够描述所表示的实体。
以下是一些符合C++标识符规则的示例:
myVariable
counter
MAX_SIZE
calculateAverage
getPersonInfo
需要注意的是,在使用标识符时,应遵循良好的命名约定和编码规范,以提高代码的可读性和可维护性。
C++ 关键字
下表列出了 C++ 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
| asm | else | new | this |
| auto | enum | operator | throw |
| bool | explicit | private | true |
| break | export | protected | try |
| case | extern | public | typedef |
| catch | false | register | typeid |
| char | float | reinterpret_cast | typename |
| class | for | return | union |
| const | friend | short | unsigned |
| const_cast | goto | signed | using |
| continue | if | sizeof | virtual |
| default | inline | static | void |
| delete | int | static_cast | volatile |
| do | long | struct | wchar_t |
| double | mutable | switch | while |
| dynamic_cast | namespace | template |
三字符组
在 C++ 中,三字符组是由两个连续的问号 ?? 加上一个字符组成的特殊符号。当编译器遇到一个三字符组时,它将被替换为一个对应的单字符,并且这个替换操作会在预处理阶段完成。
以下是一些常见的三字符组及其替换字符:
| 三字符组 | 替换 |
|---|---|
| ??= | # |
| ??/ | \ |
| ??' | ^ |
| ??( | [ |
| ??) | ] |
| ??! | | |
| ??< | { |
| ??> | } |
| ??- | ~ |
例如,??= 将被替换为 #,因此下面两行代码等价:
#define MAX ??= // 定义 MAX 为 #
MAX 100 // 替换后为 # 100
C++中的输入输出
在C++中,输入输出(Input/Output,I/O)是与程序外部环境(如终端、文件等)进行数据交互的关键操作。C++提供了多种用于输入输出的工具和类库,其中最常用的是标准输入输出流(std::cin 和 std::cout)。
1、标准输入流 (std::cin):用于从终端或其他输入设备读取数据。
- 通过 >> 操作符,可以将输入的数据存储到相应的变量中。
示例:
int num;
std::cin >> num; // 从输入读取一个整数,并存储到 num 变量中
2、标准输出流 (std::cout):用于向终端或其他输出设备输出数据。
- 通过 << 操作符,可以将数据输出到终端。
示例:
int result = 42;
std::cout << "The answer is: " << result << std::endl; // 输出字符串和变量值
除了标准输入输出流之外,C++还提供了其他一些常用的输入输出类和函数:
- 文件输入输出 (std::ifstream 和 std::ofstream):用于读写文件。
- 字符串流 (std::istringstream 和 std::ostringstream):用于在内存中读取和写入字符串。
- 格式化输出 (printf 和 sprintf):使用 C 风格的格式化规范输出数据。
- 格式化输入 (scanf 和 sscanf):使用 C 风格的格式化规范读取数据。
这些输入输出工具和类库提供了丰富的功能,可以满足不同的输入输出需求。在实际使用时,应根据具体的情况选择合适的方法,并注意处理错误和异常情况,以确保输入输出操作的正确性和可靠性。
注释
在 C++ 中,注释是用于向程序中添加说明、解释或提醒的文本。C++ 支持两种注释方式:单行注释和多行注释。
1、单行注释:以 // 开头的文本为单行注释,该行之后的所有内容都被视为注释,直到行尾为止。
示例:
// 这是一个单行注释
int num = 42; // 这也是一个单行注释
2、多行注释:以 /* 开头、以 */ 结尾的文本为多行注释,这段文本中的所有内容都被视为注释,可以跨越多行。
示例:
/*
* 这是一个多行注释,
* 包含了多行内容。
*/
int num = 42; /* 这也是一段注释 */
注释是程序中非常重要的一部分,它可以方便地记录代码的意义和目的,也可以帮助其他人理解和修改代码。在编写程序时,应当养成良好的注释习惯,尽可能详细地记录程序的设计、实现和维护信息。同时,注释应该遵循简明扼要的原则,不要过多地添加无用的注释,以免干扰读者的阅读和理解。



















