c++笔记
C++结构体赋值
C++ 中,可以在结构体中对数据进行赋值,赋值方式和限制需要注意
直接在成员声明时初始化(C++11 及以后支持)
C++11 引入了非静态成员初始化器,允许在结构体定义时直接为成员指定默认值,语法类似变量初始化:
1 | struct MyStruct { |
创建结构体对象时,若未显式赋值,成员会使用这些默认值:
1 | MyStruct s; |
通过构造函数赋值(最常用方式)
C++ 结构体可以像类一样定义构造函数,在构造函数中对成员进行初始化或赋值。这是更灵活的方式,支持根据参数动态设置值:结构体(struct)不仅可以包含数据成员,还可以定义各种函数,包括成员函数、构造函数、析构函数、静态函数等,这一点与类(class)几乎完全一致。
1 | struct Person { |
使用初始化列表(更高效的初始化方式)
构造函数中可以通过初始化列表直接初始化成员(而非赋值),性能更优(尤其对于类类型成员)
1 | struct Point { |
静态成员的初始化(需在结构体外部定义)
若结构体包含静态成员(属于整个结构体,而非某个对象),其初始化必须在结构体外部进行(类内只能声明):
1 | struct Test { |
- 结构体与类的核心区别仅在于默认访问权限(
struct默认为public,class默认为private),其他功能完全一致。
引用和拷贝
引用和拷贝是传递数据的两种核心方式,它们的选择取决于场景需求;而函数重载可以根据参数是引用还是拷贝,实现不同逻辑。
- 引用(
&):变量的 “别名”,指向原始数据的内存地址,操作引用等同于操作原始数据(无内存拷贝)。 - 例:
int a = 10; int& b = a;中,b是a的引用,修改b会同时改变a。 - 拷贝:创建原始数据的副本,新变量与原始数据占用独立内存,修改拷贝不影响原始数据(有内存开销)。
- 例:
int a = 10; int b = a;中,b是a的拷贝,修改b不影响a。
类成员函数指针
类成员函数指针 ≠ 普通函数指针
声明格式
1 | 返回值类型 (类名::*指针名)(参数列表); |
实例
1 | class MyClass |
调用格式(必须用对象 / 指针 + .* / ->*)
1 | MyClass obj; |
和 普通函数指针 的区别(超级重要)
| 项目 | 普通函数指针 | 类成员函数指针 |
|---|---|---|
| 写法 | void(*p)() |
void(MyClass::*p)() |
| 存储 | 仅存地址 | 存地址 + 偏移 / 信息(处理多继承) |
| 大小 | 4/8 字节 | 可能 8/12/16 字节 |
| 调用 | p() |
(obj.*p)() |
| 隐含 this | 无 | 有 this |
| 能否直接当回调 | 能 | 不能直接用 |
特点
成员函数指针自带 this 信息
它知道自己属于哪个类,调用时必须绑定一个对象才能执行。
不能单独调用
1 | pFunc(10); // ❌ 编译失败 |
修改成:
1 | (obj.*pFunc)(10); // ✅ |
多继承 / 虚继承下,成员指针更复杂
因为对象布局变了,指针需要存储偏移信息,所以体积更大。
类型非常严格
A::func 和 B::func 不能互相赋值,即使签名一样。
完整可运行示例
示例一:
1 | #include <iostream> |
示例二:
1 | class MyClass |