简介:《21天学通C++》是一本专为初学者设计的C++编程教程,通过21天的学习计划,帮助读者掌握C++的基础知识。结合《牛津高阶双解词典》,提供权威的双语词典,帮助理解和运用专业术语。本指南将带领读者逐步了解C++语言的核心概念,包括语法、数据类型、控制结构、函数、类和对象等,并通过实践应用提升编程技能。
1. C++编程基础
C++作为一门强大的面向对象编程语言,以其高效、可移植性以及广泛的应用领域而著称。本章将带你踏上C++编程之旅,从基础概念到高级特性,循序渐进地了解C++的精髓。
C++程序由一系列指令组成,这些指令告诉计算机如何执行特定的任务。在C++中,变量用于存储数据,而数据类型定义了变量可以存储的值的类型。C++支持各种数据类型,包括整型、浮点型、字符型和布尔型。
2. C++数据类型与运算符
C++作为一门强大的编程语言,提供了丰富的内置数据类型和运算符,用于表示和操作各种数据。本章将深入探讨C++中的数据类型和运算符,帮助读者掌握数据表示和操作的基础知识。
2.1 变量、常量和数据类型
2.1.1 变量的声明和初始化
变量是存储数据的内存单元,在使用前必须声明其数据类型。C++中变量的声明语法如下:
<数据类型> <变量名>;
例如:
int age;
double salary;
变量声明后,可以对其进行初始化,即赋予初始值。初始化语法如下:
<数据类型> <变量名> = <初始值>;
例如:
int age = 25;
double salary = 10000.0;
2.1.2 常量的定义和使用
常量是不可改变的值,在程序运行期间保持不变。C++中常量使用 const
关键字定义,语法如下:
const <数据类型> <常量名> = <常量值>;
例如:
const int MAX_SIZE = 100;
const double PI = 3.14159265;
2.1.3 数据类型的选择和转换
C++提供了多种数据类型,包括整型、浮点型、布尔型、字符型和字符串型。选择合适的数据类型对于优化程序性能和避免数据溢出至关重要。
| 数据类型 | 取值范围 | 存储大小 | |---|---|---| | bool
| true/false | 1 字节 | | char
| 单个字符 | 1 字节 | | short
| 短整型 | 2 字节 | | int
| 整型 | 4 字节 | | long
| 长整型 | 8 字节 | | float
| 单精度浮点数 | 4 字节 | | double
| 双精度浮点数 | 8 字节 | | string
| 字符串 | 动态分配 |
数据类型转换分为隐式转换和显式转换。隐式转换发生在不同类型的数据之间自动进行,例如将 int
转换为 double
。显式转换需要使用强制类型转换符,例如 (int)double_value
。
2.2 运算符
运算符是用于执行操作的符号,C++提供了丰富的运算符来处理各种数据。
2.2.1 算术运算符
算术运算符用于执行算术运算,包括加法(+)、减法(-)、乘法(*)、除法(/)和取余(%)。
| 运算符 | 操作 | |---|---| | + | 加法 | | - | 减法 | | * | 乘法 | | / | 除法 | | % | 取余 |
例如:
int sum = a + b;
double average = (a + b) / 2.0;
int remainder = a % b;
2.2.2 关系运算符
关系运算符用于比较两个表达式的值,并返回一个布尔值(true/false)。
| 运算符 | 操作 | |---|---| | == | 等于 | | != | 不等于 | | < | 小于 | | > | 大于 | | <= | 小于等于 | | >= | 大于等于 |
例如:
bool is_equal = a == b;
bool is_greater = a > b;
2.2.3 逻辑运算符
逻辑运算符用于组合布尔表达式,并返回一个布尔值。
| 运算符 | 操作 | |---|---| | && | 与(AND) | | || | 或(OR) | | ! | 非(NOT) |
例如:
bool is_valid = (a > 0) && (b < 10);
bool is_invalid = !(is_valid);
2.2.4 位运算符
位运算符用于对二进制位进行操作。
| 运算符 | 操作 | |---|---| | & | 按位与 | | | | 按位或 | | ^ | 按位异或 | | ~ | 按位取反 | | << | 左移 | | >> | 右移 |
例如:
int mask = 0x0F; // 掩码
int result = value & mask; // 按位与,保留低 4 位
3. C++程序控制流
3.1 流程控制语句
3.1.1 条件语句(if-else)
条件语句用于根据条件表达式执行不同的代码块。C++中的条件语句为 if-else
语句,语法格式如下:
if (condition) {
// condition 为 true 时执行的代码块
} else {
// condition 为 false 时执行的代码块
}
其中, condition
为条件表达式,其值可以为 true
或 false
。如果 condition
为 true
,则执行 if
代码块;否则,执行 else
代码块。
示例:
int x = 10;
if (x > 5) {
cout << "x is greater than 5" << endl;
} else {
cout << "x is less than or equal to 5" << endl;
}
输出:
x is greater than 5
3.1.2 循环语句(for、while、do-while)
循环语句用于重复执行一段代码块。C++中常用的循环语句有 for
循环、 while
循环和 do-while
循环。
3.1.2.1 for循环
for
循环使用一个初始化语句、一个条件表达式和一个更新语句来控制循环。语法格式如下:
for (initialization; condition; update) {
// 循环体
}
示例:
for (int i = 0; i < 10; i++) {
cout << i << " ";
}
输出:
0 1 2 3 4 5 6 7 8 9
3.1.2.2 while循环
while
循环使用一个条件表达式来控制循环。只要条件表达式为 true
,循环就会继续执行。语法格式如下:
while (condition) {
// 循环体
}
示例:
int x = 0;
while (x < 10) {
cout << x << " ";
x++;
}
输出:
0 1 2 3 4 5 6 7 8 9
3.1.2.3 do-while循环
do-while
循环与 while
循环类似,但它会先执行循环体,然后再检查条件表达式。语法格式如下:
do {
// 循环体
} while (condition);
示例:
int x = 0;
do {
cout << x << " ";
x++;
} while (x < 10);
输出:
0 1 2 3 4 5 6 7 8 9
3.1.3 跳转语句(break、continue、goto)
跳转语句用于控制程序流的走向。C++中常用的跳转语句有 break
、 continue
和 goto
。
3.1.3.1 break
break
语句用于跳出当前循环或 switch
语句。语法格式如下:
break;
示例:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break;
}
cout << i << " ";
}
输出:
0 1 2 3 4
3.1.3.2 continue
continue
语句用于跳过当前循环的剩余部分,并继续执行循环的下一轮。语法格式如下:
continue;
示例:
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
cout << i << " ";
}
输出:
1 3 5 7 9
3.1.3.3 goto
goto
语句用于跳转到程序中的指定标签。语法格式如下:
goto label;
label:
// 代码块
示例:
int main() {
goto label;
label:
cout << "Hello, world!" << endl;
return 0;
}
输出:
Hello, world!
4. C++面向对象编程
4.1 类和对象
4.1.1 类的定义和成员
类定义
类是面向对象编程中用于描述对象属性和行为的蓝图。类定义使用 class
关键字,后跟类名和一对花括号。花括号内包含类的成员,包括数据成员和成员函数。
class Person {
public:
string name;
int age;
void introduce() {
cout << "My name is " << name << " and I am " << age << " years old." << endl;
}
};
数据成员
数据成员是类的属性,描述对象的特征。它们可以是任何数据类型,如整型、字符串或自定义类。
成员函数
成员函数是类的行为,定义了对象可以执行的操作。它们可以访问和修改对象的数据成员。
4.1.2 对象的创建和使用
对象创建
对象是类的实例,表示特定实体。要创建对象,请使用 new
运算符,后跟类名和圆括号。
Person* person = new Person();
对象访问
可以使用点运算符( .
) 访问对象的成员。
person->name = "John Doe";
person->age = 30;
person->introduce();
4.2 继承
4.2.1 单继承和多继承
单继承
单继承允许一个类(派生类)从另一个类(基类)继承属性和行为。派生类可以访问和使用基类的公共和受保护成员。
class Student : public Person {
int studentID;
void study() {
cout << "I am studying." << endl;
}
};
多继承
多继承允许一个类从多个基类继承属性和行为。派生类可以访问和使用所有基类的公共和受保护成员。
class Teacher : public Person, public Employee {
int teacherID;
void teach() {
cout << "I am teaching." << endl;
}
};
4.2.2 虚函数和多态性
虚函数
虚函数是基类中声明的成员函数,允许派生类重写其行为。当通过基类指针调用虚函数时,将调用派生类的重写版本。
class Shape {
public:
virtual double area() = 0; // 纯虚函数
};
class Circle : public Shape {
public:
double radius;
double area() override {
return 3.14 * radius * radius;
}
};
多态性
多态性允许对象根据其类型表现出不同的行为。通过基类指针调用虚函数时,将调用与对象实际类型相对应的实现。
4.3 封装和抽象
4.3.1 封装的实现(访问控制)
访问控制
访问控制限制对类成员的访问。C++ 中有三个访问控制级别:
- public: 所有代码都可以访问。
- protected: 只有类及其派生类可以访问。
- private: 只有类本身可以访问。
class Account {
private:
double balance;
public:
void deposit(double amount) {
balance += amount;
}
double getBalance() {
return balance;
}
};
4.3.2 抽象类的定义和使用
抽象类
抽象类是包含至少一个纯虚函数的类。纯虚函数没有实现,必须在派生类中重写。抽象类不能被实例化,只能作为基类。
class Animal {
public:
virtual void makeSound() = 0; // 纯虚函数
};
class Dog : public Animal {
public:
void makeSound() override {
cout << "Woof!" << endl;
}
};
5. C++数据结构与算法
5.1 数组和字符串
5.1.1 数组的定义和操作
数组是一种数据结构,用于存储相同数据类型的元素集合。在C++中,数组使用方括号([])定义,如下所示:
int myArray[10]; // 定义一个包含 10 个整数的数组
数组元素可以通过索引访问,索引从 0 开始。例如,以下代码访问数组 myArray
的第一个元素:
cout << myArray[0] << endl;
数组可以存储各种数据类型,包括整数、浮点数、字符和字符串。
5.1.2 字符串的定义和操作
字符串是一种特殊类型的数组,用于存储字符序列。在C++中,字符串使用 string
类型定义,如下所示:
string myString = "Hello World"; // 定义一个字符串
字符串可以通过索引访问,就像数组一样。此外,字符串还提供了一系列方法用于操作字符串,例如:
-
length()
:返回字符串的长度 -
substr()
:返回字符串的一部分 -
append()
:在字符串末尾追加字符或字符串 -
find()
:在字符串中查找字符或子字符串
5.2 指针和引用
5.2.1 指针的基本概念和操作
指针是一种数据类型,它存储另一个变量的地址。指针使用星号(*)定义,如下所示:
int* ptr = &myVariable; // ptr 指向 myVariable
指针可以用来间接访问变量的值,如下所示:
cout << *ptr << endl; // 输出 myVariable 的值
指针还可以用来修改变量的值,如下所示:
*ptr = 10; // 将 myVariable 的值修改为 10
5.2.2 引用与指针的区别和联系
引用是另一种用于间接访问变量的机制。引用使用 &
符号定义,如下所示:
int& ref = myVariable; // ref 引用 myVariable
引用与指针类似,但有一些关键的区别:
- 引用必须初始化: 引用必须在定义时初始化,指向一个有效的变量。
- 引用不可重新赋值: 引用一旦初始化,就不能重新赋值指向另一个变量。
- 引用与变量共享内存: 引用与它引用的变量共享相同的内存空间,因此对引用所做的任何修改都会反映在变量本身上。
5.3 模板和STL
5.3.1 模板的基本原理和应用
模板是一种参数化的代码,它允许创建可重用的代码块,这些代码块可以处理不同类型的数据。模板使用尖括号(<>)定义,如下所示:
template <typename T>
class MyTemplate {
// ...
};
这个模板定义了一个名为 MyTemplate
的类,它接受一个类型参数 T
。这意味着 MyTemplate
可以实例化为不同类型的数据,例如:
MyTemplate<int> myIntTemplate; // 实例化 MyTemplate<int>
MyTemplate<string> myStringTemplate; // 实例化 MyTemplate<string>
5.3.2 STL库的常用数据结构和算法
STL(标准模板库)是一个C++库,它提供了许多常用的数据结构和算法。这些数据结构包括:
- 容器:如向量、列表、集合和映射
- 迭代器:用于遍历容器的指针
- 算法:如排序、搜索和转换
STL库提供了强大的工具,可用于构建高效且可维护的C++程序。
6. C++实战与牛津高阶双解词典
6.1 C++实战指南
C++实战指南提供了丰富的代码示例和实际应用场景,帮助读者将理论知识转化为实际技能。
6.1.1 文件操作
文件操作是C++中常用的功能,它允许程序读取、写入和修改文件内容。常用的文件操作函数包括:
-
ifstream
:用于读取文件 -
ofstream
:用于写入文件 -
fstream
:用于同时读写文件
// 打开文件
ifstream inputFile("input.txt");
ofstream outputFile("output.txt");
// 读取文件
string line;
while (getline(inputFile, line)) {
// 处理每一行
}
// 写入文件
outputFile << "Hello, world!" << endl;
6.1.2 网络编程
网络编程使C++程序能够通过网络与其他计算机进行通信。常用的网络编程函数包括:
-
socket()
:创建套接字 -
bind()
:将套接字绑定到特定端口 -
listen()
:监听套接字,等待连接请求 -
accept()
:接受连接请求,创建新的套接字 -
send()
:向套接字发送数据 -
recv()
:从套接字接收数据
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 绑定套接字
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
// 监听套接字
listen(sockfd, 5);
// 接受连接请求
int newsockfd = accept(sockfd, (struct sockaddr *)&addr, &addrlen);
// 发送数据
send(newsockfd, "Hello, world!", 13, 0);
6.1.3 系统编程
系统编程允许C++程序与操作系统交互。常用的系统编程函数包括:
-
fork()
:创建子进程 -
exec()
:执行程序 -
wait()
:等待子进程结束 -
pipe()
:创建管道 -
read()
:从管道读取数据 -
write()
:向管道写入数据
// 创建子进程
pid_t pid = fork();
// 子进程执行程序
if (pid == 0) {
execlp("ls", "ls", "-l", NULL);
}
// 父进程等待子进程结束
wait(NULL);
简介:《21天学通C++》是一本专为初学者设计的C++编程教程,通过21天的学习计划,帮助读者掌握C++的基础知识。结合《牛津高阶双解词典》,提供权威的双语词典,帮助理解和运用专业术语。本指南将带领读者逐步了解C++语言的核心概念,包括语法、数据类型、控制结构、函数、类和对象等,并通过实践应用提升编程技能。