目录
前言
记录下学习C++的过程。
1.C++语言的发展简史
- 1979年C++诞生于贝尔实验室。
- 1985年C++1.0版诞生。
- 1989年C++2.0版诞生。
- 1993年C++3.0版诞生。
- 1998年C++98(C++标准第一版)诞生。
- 2003年C++03(C++标准第二版)版诞生。
- 2011年C++11(C++标准第三版)版诞生。
- 2014年C++14(C++标准第四版)版诞生
- 2017年C++17(C++标准第五版)版诞生。
- C++20标准发布,带来了许多重要的新特性,包括概念(Concepts)、协程(Coroutines)、范围(Ranges)等,进一步提高了C++的表达能力和性能。
2.C++语言的特点
1.C++是一种面向对象的编程语言
C++是一种面向对象的编程语言,支持类、对象、继承、多态等面向对象的概念,使得程序可以更加模块化、可扩展和易维护。
2.C++语言是源自实践
Bjarne Stroustrup最初开发C++的动机之一就是解决他在C语言中遇到的一些实际编程问题。在贝尔实验室工作期间,他发现在开发复杂的系统时,C语言的某些特性和限制会导致编码效率低下,代码重复性高,难以维护等问题。
因此,他设计了C++,在保留了C语言的部分特性的基础上,引入了一些新的概念和功能,如类、继承、多态等,以支持面向对象编程。这些新增的特性使得程序可以更加模块化、可扩展和易维护。此外,C++还引入了模板(Template)机制,以支持泛型编程,使得程序员可以编写通用的代码,提高了代码的重用性和灵活性。
3.C++语言兼容C语言
C++最初是在C语言的基础上发展而来的,由Bjarne Stroustrup于20世纪80年代初在贝尔实验室开发。C++最初被称为"C with Classes",它在C语言的基础上引入了类(class)等面向对象编程的特性。
C++是C语言的超集,这意味着任何有效的C程序都是有效的C++程序。这种兼容性使得C++可以很好地与现有的C代码进行整合和共存。
虽然C++在语法和特性上扩展了C语言,但它仍然保留了C语言的许多特性和语法。因此,熟悉C语言的程序员可以很快地学习和掌握C++,而且可以在C++中重用他们的C代码。
C++在C语言的基础上引入了许多新的特性和功能,包括面向对象编程、模板、异常处理、命名空间等,使得C++更加适用于复杂的软件开发项目。
4.可以移植
由于C++语言的标准化和编译器的普及,C++程序通常具有很好的可移植性,可以在不同的平台上进行编译和运行,而无需进行大量的修改。
5.跨平台
C++程序可以在多个平台上运行,包括Windows、Linux、macOS等。这得益于C++的标准化和编译器的广泛支持,使得开发者可以编写一次代码,然后在不同的平台上进行编译和运行。
3.面向对象程序设计
我们知道面向对象的三大特征:继承、多态和封装。C++也支持面向对象。
1.继承
继承是面向对象编程的重要概念之一,它允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和行为。子类可以访问父类中的成员(数据成员和成员函数),并且可以在其中添加新的成员或修改已继承的成员。继承有助于实现代码的重用和组织,同时也支持多态。
2.多态
多态是指同一个函数名在不同的类中有不同的实现。C++实现多态的主要方式是通过虚函数(virtual function)和动态绑定(dynamic binding)。当一个函数在父类中声明为虚函数,并在其派生类中重写时,可以在运行时根据对象的实际类型调用正确的函数实现,而不是根据指针或引用的静态类型。多态性使得代码更具灵活性和可扩展性。
3.封装
封装是指将数据和操作数据的方法捆绑在一起,并对外部隐藏数据的具体实现细节。在C++中,封装通常通过将数据成员声明为私有的(private)并提供公有的(public)成员函数来实现。这样可以确保数据的安全性,并且使得代码更具可维护性和可扩展性。
4.C++语言的基本符号
组成语言的最小元素是基本符号。C++语言的符号主要包括三种:
1.字母
字母包括大小写字母,一共52个字符。
2.数字
0~9是个数字。
3.特殊符号
特殊符号包括+ - * /等30个符号
5.C++词汇
1.关键字
在C++中,关键字是具有特殊含义的保留字,用于表示语言的基本构造和控制结构。这些关键字在编程中具有特殊的用途,不能用作标识符或变量名。以下是C++中的一些关键字:
1. 基本数据类型关键字
- int
- double
- char
- bool
- float
- void
2. 流程控制关键字
- if
- else
- switch
- case
- default
- for
- while
- do
- break
- continue
- return
3. 类相关关键字
- class
- struct
- union
- private
- protected
- public
- virtual
- override
- final
- friend
- static
4. 命名空间关键字
namespace关键字
5. 异常处理关键字
异常处理,我们使用try、catch、throw关键字。
6. 指针和引用关键字
我们使用&q取地址和*指针。
7. 类型转换关键字
类型转换关键字主要有:dynamic_cast、static_cast 、const_cast、 reinterpret_cast
8. 布尔类型关键字
布尔类型关键字有true和false。
9. 内存分配和释放关键字
new申请内存空间,delete释放内存空间
10. 其他关键字
constexpr、const、volatile、inline、explicit、 typename、using、sizeof、template
这些关键字在C++中具有特殊的含义和用途,程序员需要熟悉它们以正确地使用和理解C++语言的语法和语义。
2.标识符
在C++中,标识符是用来命名变量、函数、类、对象以及其他用户定义的项目的名称。标识符必须遵循一定的规则,并且不能与关键字相同。以下是C++中标识符的一些基本规则:
1. 组成规则
标识符可以由字母、数字和下划线组成。
1.第一个字符必须是字母或下划线。
2.C++是区分大小写的,因此大写字母和小写字母被视为不同的字符。
3. 标识符不能包含空格和特殊字符(如@、#、$等)。
2. 命名规范
标识符的命名最好具有描述性,能够清晰地表达其所代表的含义。
1.通常采用驼峰命名法(CamelCase)或下划线命名法(snake_case)来命名标识符。
2.驼峰命名法:首字母小写,后续单词首字母大写,如:myVariable、calculateArea。
3.下划线命名法:单词之间用下划线分隔,全部小写,如:my_variable、calculate_area。
3. 保留标识符
C++中有一些保留的标识符,即关键字,不能用作标识符,如if、else、for等。
4. 命名约定
通常类名以大写字母开头,函数名和变量名以小写字母开头。
对于私有成员变量,可以使用下划线作为前缀,如:_privateVariable。
对于全局变量,可以使用"g_"作为前缀,如:`g_globalVariable`。
3.字面常量
在C++中,字面常量是指直接出现在源代码中的常量值,它们是程序中固定的值,不会改变。C++支持多种类型的字面常量,包括整型、浮点型、字符型、字符串型和布尔型等。
4.运算符
在C++中,运算符用于执行各种操作,包括算术运算、逻辑运算、位运算、赋值运算、关系运算等。
5.标点符号
在C++中,标点符号用于表示语法结构、分隔符号和特殊符号等。以下是C++中常见的标点符号:
1. **分号(;):** 表示语句的结束。
2. **逗号(,):** 用于分隔多个表达式或声明。
3. **圆括号(()):** 用于括住函数参数列表、表达式的分组等。
4. **花括号({}):** 用于定义代码块的起始和结束,如函数体、循环体等。
5. **方括号([]):** 用于定义数组、访问数组元素、指定数组大小等。
6. **冒号(:):** 用于标记函数、类、命名空间的定义结束、条件语句的标签等。
7. **双冒号(::):** 作用域解析运算符,用于访问命名空间中的成员或类的静态成员。
8. **句点(.):** 用于访问对象的成员变量或成员函数。
9. **箭头符号(->):** 用于通过指针访问对象的成员变量或成员函数。
10. **引号(' 和 "):** 用于定义字符常量和字符串常量。
11. **反斜杠(\):** 转义字符,用于转义特殊字符,如换行符 `\n`、制表符 `\t` 等。
12. **注释符号:**
- 单行注释:`//`
- 多行注释:`/* */`
13. **预处理符号:**
- `#`:用于预处理指令的起始。
- `##`:用于在宏中拼接两个标识符。
- `#include`、`#define`、`#ifdef`、`#endif` 等。
14. **空格符号和换行符:** 用于分隔单词、语句和行。
1.6 C++程序的基本框架
1.结构化程序设计框架
在C++中,结构化程序设计框架通常由主函数(main function)和一系列函数组成,这些函数按照功能模块化地实现程序的各个部分。以下是一个典型的C++结构化程序设计框架的示例:
#include <iostream>
// 函数声明
void greet();
void calculate(int x, int y);
void displayResult(int result);
int main() {
// 调用函数
greet();
// 获取输入
int a, b;
std::cout << "Enter two numbers: ";
std::cin >> a >> b;
// 调用函数
calculate(a, b);
return 0;
}
// 函数定义
void greet() {
std::cout << "Welcome to the program!" << std::endl;
}
void calculate(int x, int y) {
// 执行计算
int result = x + y;
// 调用函数
displayResult(result);
}
void displayResult(int result) {
// 显示结果
std::cout << "The result is: " << result << std::endl;
}
在上述示例中,程序包含一个主函数 `main()` 和三个自定义函数 greet()、calculate() 和 displayResult()。这些函数按照功能模块化地实现了程序的不同部分:
- main() 函数负责程序的入口、流程控制和用户交互。
- greet()函数用于向用户显示欢迎信息。
- calculate() 函数用于执行计算,并调用 `displayResult()` 函数来显示结果。
- displayResult()函数用于显示计算结果。
这种结构化的程序设计框架使得程序更易于理解、维护和扩展。通过将功能拆分为独立的函数,可以提高代码的可读性和复用性,并且可以更轻松地对程序进行测试和调试。
2.面向对象程序设计框架
在C++中,面向对象程序设计(Object-Oriented Programming, OOP)框架通常由类(Class)和对象(Object)组成,其中类定义了对象的属性和行为,而对象则是类的具体实例。
以下是一个简单的C++面向对象程序设计框架的示例:
#include <iostream>
// 类声明
class Rectangle {
private:
int width;
int height;
public:
// 构造函数
Rectangle(int w, int h) : width(w), height(h) {}
// 成员函数
int area() {
return width * height;
}
void display() {
std::cout << "Width: " << width << ", Height: " << height << std::endl;
}
};
int main() {
// 创建对象
Rectangle rect1(3, 4);
Rectangle rect2(5, 6);
// 调用成员函数
std::cout << "Rectangle 1 Area: " << rect1.area() << std::endl;
std::cout << "Rectangle 2 Area: " << rect2.area() << std::endl;
rect1.display();
rect2.display();
return 0;
}
在上述示例中,我们定义了一个名为 Rectangle 的类,它具有私有成员变量 width和 height,以及公有成员函数 area()和 display()。其中:
- 构造函数 Rectangle(int w, int h)用于初始化对象的属性。
- 成员函数 area()用于计算矩形的面积。
- 成员函数 display() 用于显示矩形的宽度和高度。
在 main() 函数中,我们创建了两个 Rectangle 类的对象 rect1和 rect2,并分别调用了它们的成员函数来计算面积并显示属性。
这种面向对象的程序设计框架使得代码更加模块化、可复用和易于维护。通过将相关的属性和行为封装在类中,可以提高代码的可读性和可维护性,并且可以更轻松地扩展和修改代码。
1.7 C++程序的开发过程
C++程序的开发过程通常包括以下几个主要阶段:
1.需求分析
在这个阶段,确定程序的功能需求和性能要求。
2.设计
根据需求分析阶段的结果,设计程序的整体结构和模块划分。这通常包括确定使用的数据结构、算法、类和函数等,以及它们之间的关系和交互方式。
3.编码
在设计阶段的基础上,开始编写程序代码。根据设计文档中的规范和要求,实现每个模块的功能,并确保代码的可读性、可维护性和性能。
4.测试
编码完成后,对程序进行测试以验证其功能的正确性和性能的稳定性。这包括单元测试、集成测试和系统测试等不同层次的测试,以确保程序的各个部分正常工作并且整体符合预期。
5.调试
在测试阶段可能会发现程序中的错误和问题,需要对这些问题进行调试和修复。通过使用调试工具和技术,定位和解决程序中的错误,并确保程序的正确性和稳定性。
6. 优化
在程序通过测试并且功能正常工作后,可以对其进行优化以提高性能和效率。这包括对算法、数据结构和代码结构等方面进行优化,以减少资源消耗和提高响应速度。
7. 部署和维护
当程序经过测试、调试和优化后,可以将其部署到目标环境中,并开始使用。在程序运行过程中可能会出现一些问题或需求变更,需要及时对程序进行维护和更新,以确保其持续稳定运行。