<think>
我们正在整理一份C++知识点的内容。由于C++知识点非常广泛,我们需要涵盖基础语法、面向对象、模板、STL、新标准特性等多个方面。下面将按照类别进行组织,每个类别下给出关键点。
注意:由于篇幅限制,我们不可能详尽所有细节,但会尽量覆盖重要知识点。
一、基础语法
1. 数据类型:基本数据类型(int, float, double, char, bool等)、类型修饰符(signed, unsigned, short, long)、类型转换(static_cast, dynamic_cast, const_cast, reinterpret_cast)、自动类型推导(auto)。
2. 变量与常量:变量定义、作用域(局部、全局、静态)、常量(const, constexpr)、宏定义(#define)。
3. 运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符(三目运算符)、逗号运算符、sizeof运算符。
4. 控制结构:条件语句(if, switch)、循环语句(for, while, do-while)、跳转语句(break, continue, goto, return)。
5. 函数:函数定义、参数传递(值传递、引用传递、指针传递)、默认参数、函数重载、内联函数(inline)、函数指针、lambda表达式。
6. 数组与字符串:一维数组、多维数组、字符数组、C风格字符串、字符串字面量、原始字符串字面量(C++11)。
7. 指针与引用:指针定义与使用、指针运算、指针与数组、指针与函数、引用(左值引用、右值引用(C++11))、空指针(nullptr, C++11)。
8. 内存管理:动态内存分配(new, delete)、智能指针(unique_ptr, shared_ptr, weak_ptr, C++11)、内存泄漏。
二、面向对象编程
1. 类与对象:类定义、对象创建、访问控制(public, private, protected)、构造函数(默认构造、拷贝构造、移动构造(C++11))、析构函数、成员初始化列表。
2. this指针:指向当前对象的指针。
3. 静态成员:静态数据成员、静态成员函数。
4. 友元:友元函数、友元类。
5. 继承:单继承、多继承、访问控制(public, protected, private继承)、菱形继承与虚继承。
6. 多态:虚函数、覆盖(override)、纯虚函数与抽象类、虚函数表(vtable)、动态绑定。
7. 运算符重载:成员函数重载、友元函数重载、常用运算符重载(如+、-、<<、>>等)。
8. 类型转换:自定义类型转换(转换构造函数、类型转换运算符)。
三、模板
1. 函数模板:定义、实例化、模板参数推导、显式指定模板参数。
2. 类模板:定义、实例化、模板特化(全特化、偏特化)。
3. 可变参数模板(C++11):参数包、包展开、折叠表达式(C++17)。
4. 模板元编程:编译期计算、类型萃取(type traits)、SFINAE。
四、标准模板库(STL)
1. 容器:序列容器(vector, deque, list, forward_list, array)、关联容器(set, map, multiset, multimap)、无序容器(unordered_set, unordered_map等,C++11)、容器适配器(stack, queue, priority_queue)。
2. 迭代器:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器、迭代器适配器(reverse_iterator, insert_iterator等)。
3. 算法:非修改序列操作(for_each, find, count等)、修改序列操作(copy, transform, replace, fill, remove等)、排序及相关操作(sort, partial_sort, binary_search等)、数值算法(accumulate, inner_product等)。
4. 函数对象:谓词(predicate)、内建函数对象(如plus, less等)、函数适配器(bind, mem_fn, C++11)。
5. 字符串:std::string,基本操作(构造、赋值、连接、比较、查找、子串等)。
五、异常处理
1. 异常机制:try块、catch块、throw表达式。
2. 异常安全:RAII(资源获取即初始化)、异常规范(已弃用)、noexcept(C++11)。
3. 标准异常:std::exception及其派生类(logic_error, runtime_error等)。
六、新标准特性(C++11/14/17/20)
1. C++11:auto、范围for循环、初始化列表、右值引用与移动语义、lambda表达式、智能指针、constexpr、nullptr、类型推导(decltype)、变长模板、override与final、强类型枚举(enum class)、线程库(std::thread, mutex, condition_variable等)、正则表达式库、随机数库等。
2. C++14:泛型lambda、lambda捕获表达式、函数返回类型推导、二进制字面量、数字分位符、变量模板等。
3. C++17:结构化绑定、if constexpr、内联变量、折叠表达式、类模板参数推导、std::optional、std::variant、std::any、文件系统库、并行算法等。
4. C++20:概念(concepts)、模块(modules)、协程(coroutines)、范围(ranges)、三向比较(spaceship operator)、日历和时区库等。
七、其他
1. 文件操作:<fstream>(ifstream, ofstream, fstream)。
2. 多线程:线程管理、互斥量、条件变量、原子操作(atomic)、异步操作(async, future, promise)、线程本地存储(thread_local)。
3. 预处理器:宏(#define, #include, #ifdef, #ifndef, #endif等)。
4. 编译与链接:编译过程(预处理、编译、汇编、链接)、静态库与动态库。
由于C++知识点非常庞大,以上只是一个大纲。下面我们给出一个简单的示例代码,展示类的基本使用和智能指针。
示例代码:一个简单的类和使用智能指针
```cpp
#include <iostream>
#include <memory> // for smart pointers
class MyClass {
public:
MyClass(int value) : data(value) {
std::cout << "Constructor called with value: " << value << std::endl;
}
~MyClass() {
std::cout << "Destructor called for value: " << data << std::endl;
}
void print() const {
std::cout << "Value: " << data << std::endl;
}
private:
int data;
};
int main() {
// 使用智能指针管理对象
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(10);
ptr1->print();
// 移动语义:转移所有权
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
if (ptr1) {
ptr1->print(); // ptr1现在为空,不会执行
}
if (ptr2) {
ptr2->print(); // 输出: Value: 10
}
return 0;
}
```
解释:这个示例展示了如何定义一个类,以及如何使用智能指针(unique_ptr)来管理动态分配的对象。unique_ptr是一种独占所有权的智能指针,当它离开作用域时,会自动释放所指向的对象。通过移动语义,我们可以将所有权从一个unique_ptr转移给另一个。
§§相关问题§§:
1. C++中的构造函数有哪几种?它们各自的作用是什么?
2. 请解释C++中的多态性,并给出一个示例。
3. 什么是模板特化?请举例说明。
4. C++11中的lambda表达式由哪些部分组成?请给出一个例子。
</think>
下面是C++核心知识点的系统整理,涵盖基础语法到高级特性,并附带示例代码:
### 一、基础语法
1. **数据类型与变量**
```cpp
int i = 10; // 整型
double d = 3.14; // 浮点型
char c = 'A'; // 字符型
bool flag = true; // 布尔型
auto x = 5.0f; // 自动类型推导 (C++11)
```
2. **常量与指针**
```cpp
const int MAX = 100; // 常量
int* ptr = &i; // 指针
int& ref = i; // 引用
```
3. **控制结构**
```cpp
// 范围for循环 (C++11)
int arr[] = {1,2,3};
for(int n : arr) {
cout << n << " ";
}
// 类型安全的nullptr (C++11)
int* p = nullptr;
```
---
### 二、面向对象编程
1. **类与对象**
```cpp
class Person {
public:
// 构造函数
Person(string n) : name(n) {}
// 虚函数 (多态基础)
virtual void speak() {
cout << "I'm " << name;
}
private:
string name;
};
class Student : public Person {
public:
// override关键字 (C++11)
void speak() override {
cout << "I'm a student";
}
};
```
2. **特殊成员函数**
```cpp
class Resource {
public:
Resource() {} // 默认构造
Resource(const Resource&); // 拷贝构造
Resource(Resource&&) noexcept; // 移动构造 (C++11)
~Resource(); // 析构函数
};
```
---
### 三、内存管理
1. **智能指针 (C++11)**
```cpp
#include <memory>
unique_ptr<int> uPtr = make_unique<int>(10); // 独占所有权
shared_ptr<int> sPtr = make_shared<int>(20); // 共享所有权
weak_ptr<int> wPtr = sPtr; // 弱引用
```
2. **移动语义**
```cpp
vector<string> createVector() {
vector<string> tmp{"a", "b", "c"};
return tmp; // 触发移动构造而非拷贝
}
```
---
### 四、模板编程
1. **函数模板**
```cpp
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
```
2. **类模板与特化**
```cpp
template <typename T>
class Box {
T content;
};
// 特化版本
template <>
class Box<string> {
string content;
void specialHandle();
};
```
---
### 五、标准库组件
1. **容器操作**
```cpp
vector<int> vec = {1,2,3};
vec.emplace_back(4); // 原位构造 (C++11)
unordered_map<string, int> map;
map["age"] = 25; // 哈希表
```
2. **Lambda表达式 (C++11)**
```cpp
auto sum = [](int a, int b) -> int {
return a + b;
};
sort(vec.begin(), vec.end(),
[](int a, int b){ return a > b; });
```
---
### 六、现代C++特性
1. **右值引用**
```cpp
void process(string&& str) {
// str为临时对象的资源
}
```
2. **并发支持 (C++11)**
```cpp
#include <thread>
void task() {
cout << "Thread running";
}
thread t(task); // 启动线程
t.join();
```
3. **概念约束 (C++20)**
```cpp
template <typename T>
concept Addable = requires(T a, T b) {
{ a + b } -> convertible_to<T>;
};
template <Addable T>
T add(T a, T b) { return a + b; }
```
---
### 七、最佳实践
1. **RAII原则**
```cpp
class FileHandle {
public:
FileHandle(string path) : f(fopen(path.c_str())) {}
~FileHandle() { if(f) fclose(f); }
private:
FILE* f;
};
```
2. **异常安全**
```cpp
try {
throw runtime_error("Oops");
} catch (const exception& e) {
cerr << "Error: " << e.what();
}
```