Skip to content

Commit 6b8d511

Browse files
authored
创建 c++面向对象基础.md
1 parent c6b6ca1 commit 6b8d511

1 file changed

Lines changed: 315 additions & 0 deletions

File tree

c++面向对象基础.md

Lines changed: 315 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,315 @@
1+
---
2+
3+
📒 C++ 面向对象基础笔记
4+
5+
6+
---
7+
8+
1. 构造函数(Constructor)
9+
10+
🌱 定义
11+
12+
类里的特殊函数,对象创建时自动调用,用来 初始化对象。
13+
14+
特点:
15+
16+
名字与类名相同
17+
18+
无返回值(连 void 都不能写)
19+
20+
可以有参数,也可以没有参数
21+
22+
可以重载(同名不同参数)
23+
24+
25+
26+
🌱 类型
27+
28+
1. 默认构造函数(无参数)
29+
30+
31+
2. 有参构造函数(带参数)
32+
33+
34+
3. 拷贝构造函数(用已有对象初始化新对象)
35+
36+
37+
4. 委托构造函数(C++11)(一个构造函数调用另一个)
38+
39+
40+
5. explicit 构造函数(防止隐式类型转换)
41+
42+
43+
44+
🌱 示例
45+
46+
class Person {
47+
public:
48+
int age;
49+
std::string name;
50+
51+
Person() : age(0), name("Unknown") {} // 默认构造
52+
Person(int a, std::string n) : age(a), name(n) {} // 有参构造
53+
Person(const Person& other) : age(other.age), name(other.name) {} // 拷贝构造
54+
};
55+
56+
🌱 注意事项
57+
58+
定义了有参构造函数,如果要 Person p; 必须手动写默认构造函数
59+
60+
构造函数不能有返回值
61+
62+
初始化列表比在函数体内赋值更高效
63+
64+
65+
66+
---
67+
68+
2. 析构函数(Destructor)
69+
70+
🌱 定义
71+
72+
类里的特殊函数,对象销毁时自动调用,用来 清理资源(内存、文件、网络等)
73+
74+
特点:
75+
76+
名字是 ~类名
77+
78+
无参数、无返回值
79+
80+
一个类只能有一个析构函数
81+
82+
83+
84+
🌱 示例
85+
86+
class Person {
87+
public:
88+
Person() { std::cout << "对象创建\n"; }
89+
~Person() { std::cout << "对象销毁\n"; }
90+
};
91+
92+
🌱 注意事项
93+
94+
析构函数不能重载
95+
96+
如果类有指针或资源,析构函数必须释放,否则会内存泄漏
97+
98+
有虚函数的类,析构函数建议加 virtual
99+
100+
101+
102+
---
103+
104+
3. 基类(Base Class)与派生类(Derived Class)
105+
106+
🌱 定义
107+
108+
基类:父类,提供通用属性和方法
109+
110+
派生类:子类,继承基类的属性和方法,可以扩展
111+
112+
113+
🌱 示例
114+
115+
class Person {
116+
public:
117+
std::string name;
118+
int age;
119+
void sayHello() { std::cout << "Hello, I am " << name << "\n"; }
120+
};
121+
122+
class Student : public Person {
123+
public:
124+
int grade;
125+
void study() { std::cout << name << " is studying.\n"; }
126+
};
127+
128+
🌱 注意事项
129+
130+
继承类型影响访问权限:public/protected/private
131+
132+
支持单继承、多继承,但多继承有菱形问题需注意
133+
134+
子类可以重写基类方法
135+
136+
137+
138+
---
139+
140+
4. 虚函数(Virtual Function)
141+
142+
🌱 定义
143+
144+
在父类函数前加 virtual,派生类重写后可实现 运行时多态
145+
146+
普通函数:编译时决定调用
147+
148+
虚函数:运行时决定调用
149+
150+
151+
🌱 示例
152+
153+
class Animal {
154+
public:
155+
virtual void speak() { std::cout << "Animal sound\n"; }
156+
};
157+
158+
class Dog : public Animal { public: void speak() override { std::cout << "Woof!\n"; } };
159+
class Cat : public Animal { public: void speak() override { std::cout << "Meow!\n"; } };
160+
161+
int main() {
162+
Animal* a;
163+
Dog d; Cat c;
164+
165+
a = &d; a->speak(); // 输出 Woof!
166+
a = &c; a->speak(); // 输出 Meow!
167+
}
168+
169+
🌱 注意事项
170+
171+
构造函数不能 virtual
172+
173+
析构函数建议 virtual
174+
175+
虚函数多用于基类指针或引用操作子类对象,实现多态
176+
177+
178+
179+
---
180+
181+
5. 多态(Polymorphism)
182+
183+
🌱 定义
184+
185+
同一个操作作用于不同类型对象时,表现出不同的行为
186+
187+
静态多态(编译时):函数重载、运算符重载
188+
189+
动态多态(运行时):虚函数 + 基类指针/引用
190+
191+
192+
🌱 注意事项
193+
194+
动态多态必须通过 基类指针或引用
195+
196+
多态可让接口统一,增加代码扩展性
197+
198+
199+
200+
---
201+
202+
6. 友元函数(Friend Function)
203+
204+
🌱 定义
205+
206+
友元函数可以访问类的私有成员,即使它不是类成员
207+
208+
209+
🌱 示例
210+
211+
class Box {
212+
private:
213+
int length;
214+
public:
215+
Box(int l) : length(l) {}
216+
friend void printLength(Box b); // 声明友元
217+
};
218+
219+
void printLength(Box b) {
220+
std::cout << "Length = " << b.length << "\n"; // 可以访问 private
221+
}
222+
223+
🌱 注意事项
224+
225+
友元函数增加耦合度,不要滥用
226+
227+
友元不是类成员,只是允许访问私有数据
228+
229+
230+
231+
---
232+
233+
7. 虚基类(Virtual Base Class)
234+
235+
🌱 问题背景:菱形继承
236+
237+
A
238+
/ \
239+
B C
240+
\ /
241+
D
242+
243+
B 和 C 都继承 A
244+
245+
D 继承 B 和 C → 会有 两份 A → 二义性
246+
247+
248+
🌱 解决方案:虚继承
249+
250+
class B : virtual public A {};
251+
class C : virtual public A {};
252+
class D : public B, public C {};
253+
254+
D 只继承 一份 A
255+
256+
消除二义性
257+
258+
259+
🌱 注意事项
260+
261+
虚继承会增加指针表开销
262+
263+
构造顺序:最底层派生类构造虚基类
264+
265+
只在多继承有共同基类时使用
266+
267+
268+
269+
---
270+
271+
8. 自带类内部初始化
272+
273+
标准库类(string, vector, fstream 等)已写好构造/析构函数
274+
275+
用起来:
276+
277+
构造函数自动初始化
278+
279+
析构函数自动释放资源
280+
281+
282+
283+
🌱 示例
284+
285+
#include <string>
286+
#include <vector>
287+
#include <iostream>
288+
using namespace std;
289+
290+
int main() {
291+
string s("Hello");
292+
vector<int> v{1,2,3};
293+
for (int x : v) cout << x << " ";
294+
}
295+
296+
297+
---
298+
299+
9. 综合记忆表
300+
301+
概念 作用 何时调用 注意事项
302+
303+
构造函数 初始化对象 对象创建 无返回值,可重载,初始化列表高效
304+
析构函数 清理资源 对象销毁 无参数,无重载,指针需释放,建议 virtual
305+
基类/派生类 父子继承 — 继承类型影响访问权限,多继承注意菱形问题
306+
虚函数 动态多态 运行时 构造函数不能 virtual,析构函数建议 virtual
307+
多态 同一接口不同表现 运行时 基类指针/引用操作子类对象
308+
友元函数 访问类私有成员 被调用 增加耦合度,非成员函数
309+
虚基类 解决菱形继承二义性 对象创建 构造顺序特殊,增加指针表开销
310+
自带类 内部构造/析构 自动 string/vector/fstream 自动管理资源
311+
312+
313+
314+
---
315+

0 commit comments

Comments
 (0)