Skip to content

Commit d2af7ac

Browse files
committed
26spring
1 parent ba3d68a commit d2af7ac

28 files changed

Lines changed: 2955 additions & 2348 deletions

.vitepress/config.mts

Lines changed: 94 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,94 @@
1-
import { defineConfig } from 'vitepress'
2-
3-
// https://vitepress.dev/reference/site-config
4-
export default defineConfig({
5-
title: "软件设计实践",
6-
description: "北大软件设计实践课程主页",
7-
head: [['link', { rel: 'icon', href: '/favicon.ico' }]],
8-
themeConfig: {
9-
// https://vitepress.dev/reference/default-theme-config
10-
nav: [
11-
{
12-
text: '主页',
13-
link: '/'
14-
},
15-
{
16-
text: '大作业文档',
17-
link: 'https://pku-software.github.io/project-doc/'
18-
}
19-
],
20-
21-
sidebar: [
22-
{
23-
text: '25春课程文档',
24-
link: '/25spring/',
25-
items: [
26-
{ text: '课程通知', link: '/25spring/notices' },
27-
{
28-
text: '在提问之前',
29-
items: [
30-
{
31-
text: '如何找到问题的答案',
32-
link: '/25spring/before_ask/how_to_find_answers'
33-
},
34-
{
35-
text: '写大作业时遇到了问题',
36-
link: 'https://pku-software.github.io/project-doc/preface/facing-problem.html'
37-
}
38-
]
39-
},
40-
{ text: '环境配置', link: 'https://pku-software.github.io/CppEnvSetup/' },
41-
{ text: '中作业',
42-
items: [
43-
{
44-
text: '中作业文档',
45-
link: '/25spring/middle_homework/document'
46-
},
47-
{
48-
text: 'Web API 文档',
49-
link: '/25spring/middle_homework/api'
50-
},
51-
{
52-
text: 'Git 基础',
53-
link: '/25spring/middle_homework/git'
54-
},
55-
{
56-
text: '常见问题',
57-
link: '/25spring/middle_homework/faq'
58-
}
59-
]
60-
},
61-
{
62-
text: "知识相关问题",
63-
items: [
64-
// {
65-
// text: '从 C 到 C++',
66-
// link: '/24spring/knowledge_related/from_c_to_cpp'
67-
// },
68-
// {
69-
// text: '类与对象初步',
70-
// link: '/24spring/knowledge_related/class_and_object_intro'
71-
// },
72-
]
73-
},
74-
]
75-
},
76-
{
77-
text: '上机作业参考答案',
78-
link: 'https://pku-software.github.io/homework-answer/'
79-
},
80-
{
81-
text: '大作业文档',
82-
link: 'https://pku-software.github.io/project-doc/'
83-
},
84-
{
85-
text: '谷雨同学的 C++ 教程',
86-
link: 'https://learn-cpp.guyutongxue.site/'
87-
}
88-
],
89-
90-
socialLinks: [
91-
{ icon: 'github', link: 'https://github.com/pku-software/pku-software.github.io' }
92-
]
93-
}
94-
})
1+
import { defineConfig } from 'vitepress'
2+
3+
// https://vitepress.dev/reference/site-config
4+
export default defineConfig({
5+
title: "软件设计实践",
6+
description: "北大软件设计实践课程主页",
7+
head: [['link', { rel: 'icon', href: '/favicon.ico' }]],
8+
themeConfig: {
9+
// https://vitepress.dev/reference/default-theme-config
10+
nav: [
11+
{
12+
text: '主页',
13+
link: '/'
14+
},
15+
{
16+
text: '大作业文档',
17+
link: 'https://pku-software.github.io/project-doc/'
18+
}
19+
],
20+
21+
sidebar: [
22+
{
23+
text: '25春课程文档',
24+
link: '/25spring/',
25+
items: [
26+
{ text: '课程通知', link: '/25spring/notices' },
27+
{
28+
text: '在提问之前',
29+
items: [
30+
{
31+
text: '如何找到问题的答案',
32+
link: '/25spring/before_ask/how_to_find_answers'
33+
},
34+
{
35+
text: '写大作业时遇到了问题',
36+
link: 'https://pku-software.github.io/project-doc/preface/facing-problem.html'
37+
}
38+
]
39+
},
40+
{ text: '环境配置', link: 'https://pku-software.github.io/CppEnvSetup/' },
41+
{ text: '中作业',
42+
items: [
43+
{
44+
text: '中作业文档',
45+
link: '/25spring/middle_homework/document'
46+
},
47+
{
48+
text: 'Web API 文档',
49+
link: '/25spring/middle_homework/api'
50+
},
51+
{
52+
text: 'Git 基础',
53+
link: '/25spring/middle_homework/git'
54+
},
55+
{
56+
text: '常见问题',
57+
link: '/25spring/middle_homework/faq'
58+
}
59+
]
60+
},
61+
{
62+
text: "知识相关问题",
63+
items: [
64+
// {
65+
// text: '从 C 到 C++',
66+
// link: '/24spring/knowledge_related/from_c_to_cpp'
67+
// },
68+
// {
69+
// text: '类与对象初步',
70+
// link: '/24spring/knowledge_related/class_and_object_intro'
71+
// },
72+
]
73+
},
74+
]
75+
},
76+
{
77+
text: '上机作业参考答案',
78+
link: 'https://pku-software.github.io/homework-answer/'
79+
},
80+
{
81+
text: '大作业文档',
82+
link: 'https://pku-software.github.io/project-doc/'
83+
},
84+
{
85+
text: '谷雨同学的 C++ 教程',
86+
link: 'https://learn-cpp.guyutongxue.site/'
87+
}
88+
],
89+
90+
socialLinks: [
91+
{ icon: 'github', link: 'https://github.com/pku-software/pku-software.github.io' }
92+
]
93+
}
94+
})

.vitepress/theme/index.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { h } from 'vue';
2-
import DefaultTheme from 'vitepress/theme';
3-
import FeaturesTitle from './FeaturesTitle.vue';
4-
5-
export default {
6-
extends: DefaultTheme,
7-
Layout() {
8-
return h(DefaultTheme.Layout, null, {
9-
'home-features-before': () => h(FeaturesTitle)
10-
});
11-
}
12-
}
1+
import { h } from 'vue';
2+
import DefaultTheme from 'vitepress/theme';
3+
import FeaturesTitle from './FeaturesTitle.vue';
4+
5+
export default {
6+
extends: DefaultTheme,
7+
Layout() {
8+
return h(DefaultTheme.Layout, null, {
9+
'home-features-before': () => h(FeaturesTitle)
10+
});
11+
}
12+
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
# 类与对象初步
2-
3-
1+
# 类与对象初步
2+
3+
Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,66 @@
1-
# 从 C 到 C++
2-
3-
### 变量定义中`*``&`的含义?
4-
5-
**Q:** `int *a1, a2;`中只有`a1`被定义为了`int*`,请问对于`int &a, b;`有没有相同的性质?对于下面的例子,用`intPtr`为何不会有类似问题?
6-
7-
```c++
8-
using intPtr = int*;
9-
intPtr p, q;
10-
```
11-
12-
**A:** 第一个问题的回答是:****,C++ 的引用声明符具有和 C 的指针声明符类似的语法。即 `int &a{b}, c{d};` 中,`c` 不是 `d` 的引用,而是从 `d` 初始化的 `int` 类型变量。
13-
14-
> 在 C 中,指针声明符、数组声明符、函数声明符等语法规则是参照解地址表达式、下标表达式和函数调用表达式的“形式”而设计的,比如 `int *p, **q` 隐含 `*p` 表达式和 `**q` 表达式都将具有 `int` 类型。但是这种设计偏好非常古怪,我们不建议如此使用。在 C++ 中,我们强烈建议每条声明只引入一个标识符,如 `int* p;``int& r = a;`,并将指针声明符、引用声明符靠左对齐以体现 `p``r` 的类型。
15-
>
16-
>> P.S. 不存在“引用的引用”类型,`int &r{...}, &&r2{...};` 中的 `&&` 是另一个语法“右值引用”。
17-
18-
对于第二个问题,`using intPtr = int*;` 所表达的含义是将 `intPtr` 作为 `int*` 类型的别名。**这并非文本替换的过程**。除了你说的 `intPtr p, q;``p``q` 都声明为 `intPtr` 类型,以下的例子也可供研究:
19-
20-
```cpp
21-
using intPtr = int*;
22-
const intPtr ptr{}; // ptr 是 int* const 类型,为什么?
23-
24-
using constInt = const int;
25-
constInt* ptr2{}; // 它的类型又是什么?
26-
const constInt* ptr3{}; // 这个呢?
27-
```
28-
29-
### `delete` 如何使用?
30-
31-
**Q:** `delete` 内存空间应该在变量完全使用完后进行吗?是不是被 `delete` 掉之后这个变量就不再存在于程序中并且不可访问了?
32-
33-
**A:** 可以这么理解。但是要注意的是,只有通过 `new` 手动申请的内存空间需要 `delete` 进行释放。释放内存是告知系统,对应的 内存空间不再需要了。下面的例子中,`delete a` 之后,`a` 指向的内存空间就不能再被使用了,但是 `a` 本身仍然存在,储存着之前分配的内存地址。这里一定要进行妥善处理,不能继续使用 `a` 指向的内存,否则将导致 "use-after-free" 错误。
34-
35-
```c++
36-
int *a = new int;
37-
*a = 5;
38-
delete a;
39-
std::cout << a << std::endl; // a仍然存在,但其指向的内存已不可用
40-
// std::cout << *a << std::endl; // 错误行为(未定义行为)
41-
```
42-
43-
### 重载函数的调用原则是什么?
44-
45-
**Q:** 函数重载中,隐式类型转换发生的情形有哪些?
46-
47-
**A:** C++ 语言标准规定,在存在多个同名的重载函数时,会进行**重载决议**,从而挑选出**唯一**的最佳可行函数。
48-
49-
重载决议的步骤较为复杂,简单来看核心原则是:**尽可能少得进行不符合直觉的隐式类型转换**
50-
51-
严谨来说:C++ 语言标准中规定了隐式类型转换的分级,从而确定了不同隐式类型转换的优劣。在调用被重载的函数时,首先会找出所有可行函数,然后对每个可行函数的调用进行排名,如果调用某个函数 `F1` 的隐式类型转换存在一个实参优于调用同名重载函数 `F2` ,那么便会调用函数 `F1` 。此外,如果在此步出现相同的排名情况,C++ 语言标准也规定了后续的比较原则,在此不再赘述。
52-
53-
如果某函数调用无法被重载决议选择,那么不允许调用。
54-
55-
### 复杂类型变量如何方便地声明?
56-
57-
**Q:** 如果要定义一个指向函数的指针数组,能否使用 `auto` 或者 `using` 来帮助我减少声明时的麻烦?
58-
59-
**A:** `auto` 关键字不能用于数组的声明,但你可以利用 `using` 关键字进行声明,参照下列示例代码:
60-
```c++
61-
using Func = int(int);
62-
using FuncPtr = Func*;
63-
FuncPtr f[5];
64-
// f为一个函数指针数组,含有5个元素
65-
// 每个元素都是指向int(int)类型的函数指针
66-
```
1+
# 从 C 到 C++
2+
3+
### 变量定义中`*``&`的含义?
4+
5+
**Q:** `int *a1, a2;`中只有`a1`被定义为了`int*`,请问对于`int &a, b;`有没有相同的性质?对于下面的例子,用`intPtr`为何不会有类似问题?
6+
7+
```c++
8+
using intPtr = int*;
9+
intPtr p, q;
10+
```
11+
12+
**A:** 第一个问题的回答是:****,C++ 的引用声明符具有和 C 的指针声明符类似的语法。即 `int &a{b}, c{d};` 中,`c` 不是 `d` 的引用,而是从 `d` 初始化的 `int` 类型变量。
13+
14+
> 在 C 中,指针声明符、数组声明符、函数声明符等语法规则是参照解地址表达式、下标表达式和函数调用表达式的“形式”而设计的,比如 `int *p, **q` 隐含 `*p` 表达式和 `**q` 表达式都将具有 `int` 类型。但是这种设计偏好非常古怪,我们不建议如此使用。在 C++ 中,我们强烈建议每条声明只引入一个标识符,如 `int* p;``int& r = a;`,并将指针声明符、引用声明符靠左对齐以体现 `p``r` 的类型。
15+
>
16+
>> P.S. 不存在“引用的引用”类型,`int &r{...}, &&r2{...};` 中的 `&&` 是另一个语法“右值引用”。
17+
18+
对于第二个问题,`using intPtr = int*;` 所表达的含义是将 `intPtr` 作为 `int*` 类型的别名。**这并非文本替换的过程**。除了你说的 `intPtr p, q;``p``q` 都声明为 `intPtr` 类型,以下的例子也可供研究:
19+
20+
```cpp
21+
using intPtr = int*;
22+
const intPtr ptr{}; // ptr 是 int* const 类型,为什么?
23+
24+
using constInt = const int;
25+
constInt* ptr2{}; // 它的类型又是什么?
26+
const constInt* ptr3{}; // 这个呢?
27+
```
28+
29+
### `delete` 如何使用?
30+
31+
**Q:** `delete` 内存空间应该在变量完全使用完后进行吗?是不是被 `delete` 掉之后这个变量就不再存在于程序中并且不可访问了?
32+
33+
**A:** 可以这么理解。但是要注意的是,只有通过 `new` 手动申请的内存空间需要 `delete` 进行释放。释放内存是告知系统,对应的 内存空间不再需要了。下面的例子中,`delete a` 之后,`a` 指向的内存空间就不能再被使用了,但是 `a` 本身仍然存在,储存着之前分配的内存地址。这里一定要进行妥善处理,不能继续使用 `a` 指向的内存,否则将导致 "use-after-free" 错误。
34+
35+
```c++
36+
int *a = new int;
37+
*a = 5;
38+
delete a;
39+
std::cout << a << std::endl; // a仍然存在,但其指向的内存已不可用
40+
// std::cout << *a << std::endl; // 错误行为(未定义行为)
41+
```
42+
43+
### 重载函数的调用原则是什么?
44+
45+
**Q:** 函数重载中,隐式类型转换发生的情形有哪些?
46+
47+
**A:** C++ 语言标准规定,在存在多个同名的重载函数时,会进行**重载决议**,从而挑选出**唯一**的最佳可行函数。
48+
49+
重载决议的步骤较为复杂,简单来看核心原则是:**尽可能少得进行不符合直觉的隐式类型转换**
50+
51+
严谨来说:C++ 语言标准中规定了隐式类型转换的分级,从而确定了不同隐式类型转换的优劣。在调用被重载的函数时,首先会找出所有可行函数,然后对每个可行函数的调用进行排名,如果调用某个函数 `F1` 的隐式类型转换存在一个实参优于调用同名重载函数 `F2` ,那么便会调用函数 `F1` 。此外,如果在此步出现相同的排名情况,C++ 语言标准也规定了后续的比较原则,在此不再赘述。
52+
53+
如果某函数调用无法被重载决议选择,那么不允许调用。
54+
55+
### 复杂类型变量如何方便地声明?
56+
57+
**Q:** 如果要定义一个指向函数的指针数组,能否使用 `auto` 或者 `using` 来帮助我减少声明时的麻烦?
58+
59+
**A:** `auto` 关键字不能用于数组的声明,但你可以利用 `using` 关键字进行声明,参照下列示例代码:
60+
```c++
61+
using Func = int(int);
62+
using FuncPtr = Func*;
63+
FuncPtr f[5];
64+
// f为一个函数指针数组,含有5个元素
65+
// 每个元素都是指向int(int)类型的函数指针
66+
```

0 commit comments

Comments
 (0)