C++面向对象
当学习C++的基础时,有一些重要的概念和语法要了解。以下是一份详细的C++基础知识概述:
1. C++是一种编程语言
C++是一种通用编程语言,具有高级特性,可以用于开发各种类型的应用程序,包括系统软件、桌面应用、游戏、嵌入式系统等。
C++是一种编译型语言,需要通过编译器将源代码转换成机器代码,然后才能运行。常见的C++编译器包括GCC、Clang和Microsoft Visual C++。
2. 基本语法
C++的基本语法包括声明变量、定义函数、控制流语句(条件语句和循环语句)等。以下是一些基本的C++代码示例:
#include <iostream> // 包含输入输出库
int main() {
// 声明和初始化变量
int age = 25;
// 输出文本到控制台
std::cout << "Hello, World!" << std::endl;
std::cout << "My age is: " << age << std::endl;
return 0; // 返回退出码
}
3. 数据类型
C++支持多种数据类型,包括整数(int
、long
)、浮点数(float
、double
)、字符(char
)、布尔(bool
)等。你还可以创建自定义数据类型,如结构体和类。
C++支持多种数据类型,这些数据类型用于定义不同类型的变量,包括整数、浮点数、字符、布尔值以及用户自定义类型。以下是对C++中一些常见数据类型的扩展说明:
-
整数数据类型:
int
:用于表示整数,通常占用4个字节,可以表示大约范围为-231到231-1的整数。long
:用于表示长整数,占用8个字节,范围更大。short
:用于表示短整数,占用2个字节,范围较小。
示例:
int num = 42; long bigNum = 1234567890;
-
浮点数数据类型:
float
:用于表示单精度浮点数,通常占用4个字节。double
:用于表示双精度浮点数,通常占用8个字节,更精确。
示例:
float pi = 3.14159265359f; double preciseValue = 0.12345678901234567890;
-
字符数据类型:
char
:用于表示一个字符,通常占用1个字节。wchar_t
:用于表示宽字符,通常占用2或4个字节,用于支持Unicode字符。
示例:
char letter = 'A'; wchar_t unicodeChar = L'文';
-
布尔数据类型:
bool
:用于表示布尔值,只有两个可能的值:true
和false
。
示例:
bool isTrue = true; bool isFalse = false;
-
数组:
数组是一种复合数据类型,用于存储相同数据类型的多个元素。数组的大小在创建时指定,且大小固定。示例:
int numbers[5] = {1, 2, 3, 4, 5}; char name[10] = "John";
-
字符串:
C++中没有内置的字符串数据类型,但你可以使用字符数组或C++标准库中的std::string
类来处理字符串。示例:
char str[] = "Hello, World!"; std::string name = "Alice";
-
指针和引用:
- 指针(
pointer
)是一种特殊的数据类型,用于存储内存地址。指针可以指向其他变量或数据。 - 引用(
reference
)是一个别名,用于访问其他变量的值。引用在声明时必须初始化,且不能改变绑定的对象。
示例:
int x = 10; int* ptr = &x; // 指向整数x的指针 int& ref = x; // 引用整数x
- 指针(
-
枚举类型:
枚举(enum
)类型用于定义一组有限的命名整数值。它可以提高代码的可读性。示例:
enum Color { Red, Green, Blue }; Color myColor = Green;
这些是C++中的一些常见数据类型。理解这些数据类型以及它们的用途是编写C++程序的关键。根据项目的需求,你可以选择合适的数据类型来存储和处理数据。同时,C++还支持用户自定义数据类型,包括结构体和类,使得你可以创建自己的复合数据类型来组织数据和功能。
4.运算符
C++提供了各种运算符,用于执行数学运算、逻辑运算和位运算等。例如,+
用于加法,==
用于相等比较,&
用于位与操作。
C++中有多种运算符,用于执行各种不同的操作,包括数学运算、逻辑运算、位运算和其他操作。以下是一些常见的C++运算符的详细讲解:
-
算术运算符:
+
:加法运算符,用于将两个数相加。-
:减法运算符,用于将一个数减去另一个数。*
:乘法运算符,用于将两个数相乘。/
:除法运算符,用于将一个数除以另一个数。%
:取模运算符,用于计算一个数除以另一个数的余数。
示例:
int a = 10; int b = 5; int sum = a + b; // 15 int difference = a - b; // 5 int product = a * b; // 50 int quotient = a / b; // 2 int remainder = a % b; // 0
-
赋值运算符:
=
:赋值运算符,用于将右侧的值赋给左侧的变量。+=
、-=
、*=
、/=
、%=
等:组合赋值运算符,用于将运算结果赋给左侧的变量。
示例:
int x = 5; x += 3; // x现在的值为8,相当于 x = x + 3;
-
比较运算符:
==
:等于运算符,用于检查两个值是否相等。!=
:不等于运算符,用于检查两个值是否不相等。<
、>
:小于和大于运算符,用于比较两个值的大小。<=
、>=
:小于等于和大于等于运算符,用于比较两个值的大小。
示例:
int p = 5; int q = 3; bool isEqual = (p == q); // false bool isNotEqual = (p != q); // true bool isLessThan = (p < q); // false
-
逻辑运算符:
&&
:逻辑与运算符,用于将两个条件连接,只有当两个条件都为真时才为真。||
:逻辑或运算符,用于将两个条件连接,只要其中一个条件为真就为真。!
:逻辑非运算符,用于取反一个条件。
示例:
bool condition1 = true; bool condition2 = false; bool resultAnd = condition1 && condition2; // false bool resultOr = condition1 || condition2; // true bool resultNot = !condition1; // false
-
位运算符:
&
:位与运算符,对两个数的每一位执行与操作。|
:位或运算符,对两个数的每一位执行或操作。^
:位异或运算符,对两个数的每一位执行异或操作。~
:位取反运算符,对一个数的每一位取反。<<
:左移运算符,将二进制数左移指定位数。>>
:右移运算符,将二进制数右移指定位数。
示例:
int num1 = 5; // 二进制:0101 int num2 = 3; // 二进制:0011 int bitwiseAnd = num1 & num2; // 1 (二进制:0001) int bitwiseOr = num1 | num2; // 7 (二进制:0111) int bitwiseXor = num1 ^ num2; // 6 (二进制:0110) int bitwiseNot = ~num1; // -6 (二进制:11111010) int leftShift = num1 << 2; // 20 (二进制:10100) int rightShift = num1 >> 1; // 2 (二进制:0010)
这些是C++中一些常见的运算符,它们用于执行不同类型的操作,帮助你处理数据、控制程序的流程和进行逻辑判断。理解这些运算符是编写C++程序的重要基础。
5. 函数
C++中的函数是一种重要的编程结构,用于封装可重用的代码块,使程序更加模块化和可维护。以下是关于C++函数的详细讲解:
-
函数声明和定义:
在C++中,函数通常需要在使用之前先声明或定义。函数声明包括函数的名称、参数列表和返回类型。函数定义则包括函数的实际实现。示例:
// 函数声明 int add(int a, int b); // 函数定义 int add(int a, int b) { return a + b; }
在声明时可以省略参数名,只需要指定参数的类型,如
int add(int, int);
。这样的声明被称为函数原型。 -
函数参数:
函数可以接受零个或多个参数,这些参数用于向函数传递数据。参数可以是基本数据类型、自定义数据类型、指针、引用等。示例:
int add(int a, int b) { return a + b; }
-
函数返回值:
函数可以返回一个值,该值的类型由函数的返回类型指定。如果函数没有返回值,可以使用void
作为返回类型。示例:
int add(int a, int b) { return a + b; } void printHello() { std::cout << "Hello, World!" << std::endl; }
-
函数调用:
要调用函数,只需使用函数名称和合适的参数列表,将函数调用包含在程序中的适当位置。示例:
int result = add(3, 5); // 调用add函数,并将返回值存储在result中
-
函数重载:
C++允许函数重载,这意味着你可以定义多个同名函数,只要它们的参数列表不同。编译器会根据调用时提供的参数来确定调用哪个版本的函数。示例:
int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; }
-
默认参数:
C++允许在函数参数列表中设置默认参数值,这样在调用函数时可以不传递这些参数,而是使用默认值。示例:
int multiply(int a, int b = 2) { return a * b; } int result = multiply(5); // 使用默认参数值,result为10
-
递归函数:
C++允许函数调用自身,这被称为递归。递归函数通常需要有一个停止条件,以防止无限递归。示例:
int factorial(int n) { if (n <= 1) { return 1; } else { return n * factorial(n - 1); } }
-
函数指针:
C++支持函数指针,允许你将函数的地址存储在指针变量中,并通过指针调用函数。示例:
int (*funcPtr)(int, int) = add; // 声明并初始化函数指针 int result = funcPtr(3, 5); // 使用函数指针调用add函数
函数是C++中的重要概念,它们使代码结构更清晰、可读性更好,同时也提供了重用和抽象的机会。理解如何声明、定义、调用和使用函数是C++编程的关键要点之一。
6. 控制流
控制流语句在C++中是用来控制程序的执行流程的重要工具。它们允许你根据不同的条件执行不同的代码块,或者重复执行一段代码块。以下是关于C++中常见的控制流语句的详细讲解:
条件语句
-
if
语句:if
语句用于执行一个代码块,当指定的条件为真时才会执行。- 可以与
else
结合使用,以在条件不满足时执行另一个代码块。
示例:
int x = 10; if (x > 5) { std::cout << "x 大于 5" << std::endl; } else { std::cout << "x 不大于 5" << std::endl; }
-
else if
语句:else if
语句用于在多个条件之间进行选择,当前一个条件不满足时,检查下一个条件。- 可以与
if
和else
一起使用,以实现多个条件的分支。
示例:
int x = 10; if (x > 10) { std::cout << "x 大于 10" << std::endl; } else if (x == 10) { std::cout << "x 等于 10" << std::endl; } else { std::cout << "x 小于 10" << std::endl; }
-
switch
语句:switch
语句用于根据不同的情况执行不同的代码块,通常用于对某个表达式的多个可能值进行测试。- 每个
case
标签定义一个可能的值,而default
标签定义了在没有匹配的情况下要执行的代码块。
示例:
int day = 2; switch (day) { case 1: std::cout << "星期一" << std::endl; break; case 2: std::cout << "星期二" << std::endl; break; default: std::cout << "其他天" << std::endl; }
循环语句
-
for
循环:for
循环用于重复执行一段代码,通常基于一个计数器或迭代器的值。- 由初始化部分、条件部分和迭代部分组成。
示例:
for (int i = 0; i < 5; i++) { std::cout << "循环迭代:" << i << std::endl; }
-
while
循环:while
循环用于根据条件重复执行一段代码,只要条件为真。- 需要谨慎处理,以防止无限循环。
示例:
int count = 0; while (count < 3) { std::cout << "循环迭代:" << count << std::endl; count++; }
-
do-while
循环:do-while
循环与while
循环类似,但它首先执行循环体,然后检查条件是否为真。- 保证至少执行一次循环体。
示例:
int count = 0; do { std::cout << "循环迭代:" << count << std::endl; count++; } while (count < 3);
这些是C++中常见的控制流语句。它们使程序能够根据不同的条件执行不同的代码块或重复执行一段代码,从而实现灵活的程序逻辑。理解这些语句是编写C++程序的关键要点之一。
7.数组和容器
C++提供了多种数据结构,用于存储和操作数据集合。这些数据结构包括数组和各种容器,如std::vector
、std::array
、std::map
和std::set
等。以下是关于这些数据结构的详细讲解:
数组(Array):
-
数组的定义:
- 数组是一种固定大小的数据结构,用于存储相同类型的元素。
- 数组的大小在创建时确定,不能在运行时改变。
示例:
int myArray[5]; // 声明一个包含5个整数的数组
-
数组的访问:
- 使用索引来访问数组中的元素,数组的索引从0开始。
示例:
myArray[0] = 1; // 设置第一个元素为1 int value = myArray[2]; // 获取第三个元素的值
-
数组的初始化:
- 数组可以在声明时进行初始化,也可以使用循环或赋值语句进行初始化。
示例:
int myArray[5] = {1, 2, 3, 4, 5}; // 初始化数组
-
数组的限制:
- 数组的大小固定,因此如果不知道需要存储多少数据,可能会导致内存浪费或溢出问题。
向量(Vector)
-
std::vector
的定义:std::vector
是C++标准库提供的动态数组容器,可以存储可变数量的元素。- 向量的大小可以在运行时动态增长或缩小。
示例:
#include <vector> std::vector<int> myVector; // 声明一个整数向量
-
向量的操作:
std::vector
提供了许多方法来添加、删除、访问和修改元素。
示例:
myVector.push_back(1); // 在向量末尾添加元素 myVector.pop_back(); // 删除末尾元素 int value = myVector[2]; // 获取第三个元素的值
数组容器(Array Container)
-
std::array
的定义:std::array
是C++标准库提供的固定大小数组容器,类似于普通数组,但提供了更多的功能和安全性。
示例:
#include <array> std::array<int, 5> myArray; // 声明一个包含5个整数的数组容器
-
std::array
的操作:std::array
支持数组的所有操作,同时提供了一些便利的方法,如size()
和at()
来访问元素。
示例:
myArray[0] = 1; // 设置第一个元素为1 int size = myArray.size(); // 获取数组容器的大小 int value = myArray.at(2); // 获取第三个元素的值
映射(Map)
-
std::map
的定义:std::map
是C++标准库提供的关联容器,用于存储键-值对。每个键都映射到一个值。- 键是唯一的,用于快速查找值。
示例:
#include <map> std::map<std::string, int> myMap; // 声明一个键为字符串、值为整数的映射
-
std::map
的操作:std::map
提供了方法来添加、删除、查找和修改键-值对。
示例:
myMap["apple"] = 5; // 添加键-值对 myMap["banana"] = 3; int count = myMap["apple"]; // 查找键对应的值
集合(Set)
-
std::set
的定义:std::set
是C++标准库提供的关联容器,用于存储唯一值的集合,不允许重复。- 集合中的元素是按照一定的顺序排列的。
示例:
#include <set> std::set<int> mySet; // 声明一个整数集合
-
std::set
的操作:std::set
提供了方法来插入、删除、查找和迭代元素。
示例:
mySet.insert(5); // 插入元素 mySet.insert(3); mySet.erase(3); // 删除元素 bool exists = mySet.find(5) != mySet.end(); // 检查元素是否存在
这些是C++中常见的数组和容
器类型,它们用于存储和操作不同类型的数据集合。选择合适的数据结构取决于项目的需求,例如,使用数组当你需要一个固定大小的容器,使用向量或映射当你需要动态大小或键-值对的存储。这些容器提供了丰富的操作和功能,使数据管理更加方便和高效。
8.指针和引用
C++允许你使用指针和引用来处理内存和数据。指针是变量,存储内存地址,而引用是变量的别名。
指针和引用是C++中用于处理内存和数据的重要概念,它们允许你有效地操作和传递变量。下面详细讲解指针和引用的概念、用法和区别:
指针(Pointer)
-
指针的定义:
- 指针是一种变量,它存储另一个变量的内存地址。
- 通过指针,你可以直接访问或修改存储在内存中的数据。
示例:
int x = 10; // 声明一个整数变量 int* ptr = &x; // 声明一个整数指针,存储x的地址
-
指针的解引用:
- 使用
*
运算符可以将指针解引用,即获取指针所指向的变量的值。
示例:
int value = *ptr; // 解引用指针,获取x的值(value为10)
- 使用
-
指针的操作:
- 指针可以进行递增和递减操作,以便访问连续内存位置的数据。
- 指针可以进行算术运算,如加法和减法,以访问非连续内存位置的数据。
示例:
int arr[5] = {1, 2, 3, 4, 5}; int* p = arr; // p指向数组的第一个元素 int thirdValue = p[2]; // 使用指针访问数组的第三个元素 p++; // 将指针移动到下一个元素
-
指针的空值(nullptr):
- C++11引入了
nullptr
关键字,用于表示空指针,即指针不指向任何有效的内存地址。
示例:
int* nullPointer = nullptr; // 声明一个空指针
- C++11引入了
引用(Reference)
-
引用的定义:
- 引用是一个变量的别名,它在声明时必须初始化,并且不能改变绑定的对象。
- 引用允许你通过另一个名称访问相同的内存位置,它通常用于函数参数传递和函数返回值。
示例:
int x = 10; // 声明一个整数变量 int& ref = x; // 声明一个整数引用,绑定到x
-
引用的使用:
- 引用可以像变量一样使用,而不需要解引用操作。
- 对引用的修改会直接反映在原始变量上。
示例:
int y = 20; ref = y; // 将y的值赋给x,x现在的值为20
-
引用作为函数参数:
- 引用经常用于函数参数,通过引用传递参数可以使函数修改调用者提供的变量。
示例:
void doubleValue(int& num) { num *= 2; } int value = 5; doubleValue(value); // 通过引用传递参数,value现在的值为10
-
引用的优势:
- 引用可以避免复制大型对象,提高程序的性能。
- 引用作为函数参数时,可以直接修改调用者的变量,而不需要返回值。
指针和引用的区别
-
指针 vs. 引用:
- 指针可以在运行时重新指向不同的对象,而引用一旦绑定到对象就不能改变。
- 引用更安全,因为它们不会为空,而指针可能为空。
- 引用通常用于函数参数传递和返回值,而指针用于需要动态内存分配或可为空的情况。
-
适用场景:
- 使用指针:需要动态分配内存、处理数据结构、数组或进行算术运算时。
- 使用引用:传递函数参数、返回局部变量的引用、提高性能或使代码更清晰时。
指针和引用是C++中的重要特性,它们为程序员提供了更多的控制权和灵活性,但也需要小心使用,以避免内存错误和不必要的复杂性。理
解指针和引用的概念以及如何正确使用它们是C++编程的关键要点之一。