CPP知识点复习归纳-当const碰到typedef类型别名

文章讨论了C++中const关键字修饰指针的两种情况:常量指针和指向常量的指针。通过示例代码解释了constpstring类型的变量cstr是一个常量指针,不能改变其指向,但可以修改指向的对象。在尝试修改cstr的指向时,编译器会报错。

已知:

typedef char *pstring;

则:

const pstring cstr = nullptr;

问cstr是什么类型?


typedef char *pstring;---》pstring是char *的别名

const限定的指针有两种

1)常量指针 char * const ptr;

指针只能指向特定的对象,不能指向其它的对象,但是可以通过常量指针修改指向的对象

char * const cstr = nullptr;

2)指向常量的指针(不能通过该指针修改指向的对象,但是该指针可以指向其它对象)

const char * cstr = nullptr; ->cstr 指向常量的指针

#include <iostream>
using namespace std;
typedef char *pstring;
void test()
{
    char c = 'C';
    const pstring cstr = &c;
    char b = 'B';

    //测试1 修改指向的值
    *cstr = 'B';

    //测试2 修改指向
    // cstr = &b; //报错如下
    /* main.cpp:9:13: error: assignment of read-only variable 'cstr'
     cstr = &b; */

    //  通过测试可以得出,const pstring是常量指针
}
int main()
{
    test();
    return 0;
}

const pstring cstr

这里const限定的是pstring,pstring是指针。那么const限定的是pstring,这是一个常量指针

const char * cstr = nullpt

这里const修饰的是char

const靠近谁限定谁

<think> 我们参考了用户提供的引用内容,并结合C++的核心知识点进行整理。以下是C++编程中必须掌握的详细知识点,按照主题分类: ### 1. 基础知识 - **数据类型**:基本类型(int, float, double, char, bool等)、复合类型(数组、结构体、联合体)[^1]。 - **变量与常量**:变量声明与定义,const常量,constexpr(C++11起)[^1]。 - **运算符**:算术、关系、逻辑、位运算、赋值等运算符及其优先级。 - **控制结构**:条件语句(if-else, switch)、循环语句(for, while, do-while)、跳转语句(break, continue, goto)[^1]。 ### 2. 函数 - **函数定义与调用**:参数传递(值传递、引用传递、指针传递),返回值[^1]。 - **函数重载**:同一作用域内同名函数根据参数列表不同进行重载[^1]。 - **内联函数**:用`inline`关键字声明,避免函数调用开销[^1]。 - **默认参数**:函数参数可设置默认值,但默认参数必须从右向左连续设置[^1]。 - **Lambda表达式**(C++11):匿名函数,基本语法:`[capture](parameters) -> return_type { body }`。可捕获外部变量(值捕获、引用捕获)[^3]。 ### 3. 面向对象编程(OOP) - **类与对象**: - 类定义:数据成员和成员函数,访问控制(public, protected, private)[^1][^4]。 - 构造函数与析构函数:对象初始化与清理。构造函数可重载,析构函数无参数[^4]。 - **继承**: - 派生类继承基类成员(单继承、多继承)。 - 继承方式(public, protected, private)决定基类成员在派生类的访问权限[^1][^4]。 - **多态**: - 虚函数(`virtual`):运行时多态,通过基类指针/引用调用派生类重写函数。 - 纯虚函数与抽象类:包含纯虚函数的类不能实例化[^1]。 - **运算符重载**:通过成员函数或全局函数重载运算符(如`+`, `<<`)[^1]。 - **友元**:友元函数/类可访问类的私有成员[^1]。 ### 4. 内存管理 - **动态内存分配**: - `new`/`delete`:分配/释放单个对象内存。 - `new[]`/`delete[]`:分配/释放数组内存[^1]。 - **智能指针**(C++11起): - `unique_ptr`:独占所有权,不可拷贝但可移动。 - `shared_ptr`:共享所有权,引用计数。 - `weak_ptr`:避免`shared_ptr`循环引用[^1]。 - **引用与指针区别**: - 引用必须初始化且不可更改绑定对象;指针可为空并重新指向[^2]。 - 引用更安全,指针更灵活[^2]。 ### 5. 模板与泛型编程 - **函数模板**:定义通用函数,如: ```cpp template <typename T> T max(T a, T b) { return a > b ? a : b; } ``` - **类模板**:定义通用类,如`std::vector<T>`[^1]。 - **模板特化**:为特定类型提供特殊实现[^1]。 ### 6. 标准模板库(STL) - **容器**: - 序列容器:`vector`, `list`, `deque`。 - 关联容器:`set`, `map`, `unordered_set`, `unordered_map`(C++11)[^1]。 - **迭代器**:提供访问容器元素的统一接口(如`begin()`, `end()`)[^1]。 - **算法**:排序(`sort`)、查找(`find`)、遍历(`for_each`)等泛型算法[^1][^3]。 - **Lambda表达式与STL结合**:常用于算法参数,如: ```cpp std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; }); ``` ### 7. 新特性(C++11/14/17) - **自动类型推导**:`auto`声明变量,`decltype`推导表达式类型[^1]。 - **范围for循环**:`for (auto& x : container)`[^1]。 - **移动语义**:右值引用(`&&`)、`std::move`避免不必要的拷贝[^1]。 - **并发支持**:`std::thread`, `std::mutex`, `std::atomic`等[^1]。 ### 8. 其他关键点 - **异常处理**:`try`/`catch`/`throw`机制[^1]。 - **文件I/O**:`ifstream`, `ofstream`, `fstream`[^1]。 - **常量正确性**:`const`修饰成员函数(如`void func() const;`)[^1][^4]。 --- §§相关问题§§ 1. 如何正确使用C++中的智能指针避免内存泄漏? 2. C++多态的实现原理是什么? 3. 模板元编程有哪些典型应用场景? 4. C++11中的Lambda表达式如何捕获外部变量? </think> 以下是C++编程中必须掌握的详细知识点,结合核心概念和实际应用场景进行系统梳理: ### 一、基础语法与数据类型 1. **基本数据类型** - 整型:`int`, `short`, `long`, `long long`(含有符号/无符号变体) - 浮点型:`float`, `double`, `long double` - 字符型:`char`(含`signed char`/`unsigned char`) - 布尔型:`bool`(值域:`true`/`false`) - 类型大小:`sizeof`运算符获取内存占用(如`sizeof(int)=4`字节) 2. **复合数据类型** - 数组:`int arr[5] = {1,2,3};` - 结构体:`struct Point { int x; int y; };` - 联合体:`union Data { int i; float f; };` - 枚举:`enum Color { RED, GREEN=5, BLUE };` 3. **类型修饰符** - 常量:`const int MAX = 100;` - 易变:`volatile int counter;` - 类型别名:`using IntPtr = int*;`(C++11)或`typedef int* IntPtr;` --- ### 二、内存管理(核心重点) 1. **手动内存管理** - 动态分配:`int* p = new int;` / `int* arr = new int[10];` - 释放内存:`delete p;` / `delete[] arr;` - 常见错误:内存泄漏、悬空指针、二次释放 2. **智能指针**(C++11起) ```cpp #include <memory> std::unique_ptr<int> uptr(new int(42)); // 独占所有权 std::shared_ptr<int> sptr = std::make_shared<int>(100); // 共享所有权 std::weak_ptr<int> wptr(sptr); // 避免循环引用 ``` 3. **内存模型** - 栈内存:自动管理,用于局部变量 - 堆内存:手动管理(`new/delete`),生命周期由程序员控制 - 内存对齐:`alignas(16) struct Data {...}`(C++11) --- ### 三、面向对象编程(OOP) 1. **类与对象** ```cpp class Circle { private: double radius; // 数据封装 public: Circle(double r) : radius(r) {} // 构造函数初始化列表 double area() const { return 3.14 * radius * radius; } // const成员函数 }; ``` 2. **继承与多态** - 继承方式:`public/protected/private` - 虚函数:`virtual void draw() = 0;`(纯虚函数定义接口) - 重写:`void draw() override {...}`(C++11明确重写) 3. **特殊成员函数** - 构造函数/析构函数 - 拷贝控制:拷贝构造、拷贝赋值、移动构造(C++11)、移动赋值(C++11) - `=default`/`=delete`显式控制默认函数 --- ### 四、高级特性 1. **模板编程** ```cpp // 函数模板 template <typename T> T max(T a, T b) { return (a > b) ? a : b; } // 类模板 template <class T> class Stack { std::vector<T> elems; public: void push(T const&); T pop(); }; ``` 2. **Lambda表达式**(C++11) ```cpp auto sum = [](int a, int b) -> int { return a + b; }; // 显式返回类型 std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; // 隐式返回类型 }); ``` - 捕获方式:`[]`(不捕获)`[&]`(引用捕获)`[=]`(值捕获)`[x, &y]`(混合捕获) 3. **引用与指针区别** [^2] | **特性** | **引用** | **指针** | |----------------|------------------------------|------------------------| | 初始化 | 必须初始化 | 可不初始化 | | 空值 | 不能绑定空值 | 可为`nullptr` | | 重绑定 | 不可更改绑定对象 | 可重新指向 | | 内存占用 | 通常不额外占用内存(别名) | 占用存储空间(地址) | --- ### 五、标准库(STL)核心组件 1. **容器** - 序列容器:`vector`, `deque`, `list`, `forward_list`(C++11) - 关联容器:`set`, `map`, `multiset`, `multimap` - 无序容器:`unordered_set`, `unordered_map`(C++11) 2. **算法** ```cpp #include <algorithm> std::sort(vec.begin(), vec.end()); // 排序 auto it = std::find(v.begin(), v.end(), 42); // 查找 std::transform(src.begin(), src.end(), dest.begin(), [](int x){ return x*2; }); ``` 3. **I/O流** - 控制台:`std::cin`/`std::cout`/`std::cerr` - 文件流:`std::ifstream`/`std::ofstream` - 字符串流:`std::istringstream`/`std::ostringstream` --- ### 六、现代C++特性(C++11/14/17/20) 1. **自动类型推导** - `auto x = 5;` // x → int - `decltype`推导表达式类型:`decltype(expr) y = expr;` 2. **右值引用与移动语义** ```cpp // 移动构造函数 Vector(Vector&& other) noexcept : data(other.data), size(other.size) { other.data = nullptr; // 避免资源被释放 } ``` 3. **并发支持** ```cpp #include <thread> void task() { /* ... */ } std::thread t1(task); // 创建线程 t1.join(); // 等待线程结束 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值