Skip to content

Commit 6930c69

Browse files
committed
Updated to Chapter 8, Section 3
1 parent acbe0e8 commit 6930c69

15 files changed

+507
-72
lines changed

Structure.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -543,11 +543,11 @@
543543

544544
> 移动构造函数放精讲篇。
545545
546-
#### 初值列语法
546+
#### 成员的初始化
547547

548-
怎么使用初值列,为什么初值列更高效。
548+
怎么使用初值列(成员初始化列表),为什么初值列更高效。
549549

550-
> 本来想放精讲篇,但是感觉也很重要,而且也不是很难理解,所以就放这儿了。
550+
怎么定义和使用成员默认值,
551551

552552
#### 析构函数
553553

generalized_parts/02_basic_operation_on_data/03_operators.tex

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ \subsection*{运算符的操作数与返回值}
2525
\begin{lstlisting}
2626
a = (b = (c = 0)); //连续赋值,等价于a=b=c=0;
2727
\end{lstlisting}
28-
圆括号改变了计算的顺序\footnote{再次提醒,方括号\lstinline@[]@和花括号\lstinline@\{\}@它们有各自的作用。我们不能用它们来达到改变运算顺序的目的,只能用圆括号\lstinline@()@。},它将把括号内的部分当作一个整体来对待。于是这段代码执行的操作就是
28+
圆括号(Parentheses\textsuperscript{美}/Round brackets\textsuperscript{英})改变了计算的顺序\footnote{再次提醒,方括号\lstinline@[]@和花括号\lstinline@\{\}@它们有各自的作用。我们不能用它们来达到改变运算顺序的目的,只能用圆括号\lstinline@()@。},它将把括号内的部分当作一个整体来对待。于是这段代码执行的操作就是
2929
\begin{enumerate}
3030
\item \lstinline@c=0@ 中的赋值运算符将左操作数 \lstinline@c@ 的值变为右操作数 \lstinline@0@。最后返回 \lstinline@c@ 的引用。
3131
\item \lstinline@b=(c=0)@ 中的赋值运算符将左操作数 \lstinline@b@ 的值变为 \lstinline@(c=0)@ 的返回值,即 \lstinline@c@ 。因为此时 \lstinline@c@ 的值为 \lstinline@0@,所以 \lstinline@b@ 的值变为 \lstinline@0@。最后返回 \lstinline@b@ 的引用。

generalized_parts/03_control_flow/04_introduction_to_scope.tex

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ \section{作用域初步}
1818
编译器的报错信息已经以注释的方式放在代码中,它的意思是:``\lstinline@i@ 在这个作用域中没有定义。''但是我们在前面明明定义了 \lstinline@i@ 啊!而且,我们每次使用 \lstinline@i@ 的位置都在定义之后,不应该出现上述问题才对。其实这个问题的关键就在于\textbf{作用域(Scope)}。\par
1919
在C++中,并非所有变量一经定义就可以永久使用。在很多场合之下,我们需要使用一些临时变量,它们可以帮助我们更简单地实现一些功能。但是任何变量都会占用内存空间,如果临时变量太多,可能会导致内存空间被浪费(它们大都只在很短的时间里使用廖廖几次,却要长期占据宝贵的内存空间)。\par
2020
我们希望这种临时变量只有很短的生存期,它们只在我们需要的时候``被定义出来'',而在我们不需要的时候``被销毁回收'',腾出内存空间。C++如何控制变量的生存期呢?就是通过作用域来实现的。\par
21-
这里我们只对作用域作简单介绍。最简单的情况,一个花括号\lstinline@{}@ 套住的范围就是一个作用域\footnote{在变量定义的统一初始化时,我们也用到了花括号,但是那个不能称之为一个作用域。详细的内容我们暂且不讲。}。下面的代码展示了一个最基本的嵌套作用域问题。
21+
这里我们只对作用域作简单介绍。最简单的情况,一对花括号\lstinline@{}@ 套住的范围就是一个作用域\footnote{在变量定义的统一初始化时,我们也用到了花括号(Braces\textsuperscript{美}/Curly brackets\textsuperscript{英}),但是那个不能称之为一个作用域。详细的内容我们暂且不讲。}。下面的代码展示了一个最基本的嵌套作用域问题。
2222
\begin{lstlisting}
2323
int main() { //这是一个外层作用域
2424
int x; // 在此作用域内定义的变量可以在更内层的作用域中使用

generalized_parts/05_composite_types_and_their_use/03_lvalue_reference_and_passing_arguments.tex

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ \subsection*{引用的类型与 \lstinline@is_same@}
146146
cout << is_same<double, long double>::value; //不同,故输出0
147147
\end{lstlisting}
148148
提醒读者,\lstinline@cout@ 输出 \lstinline@bool@ 类型的值时,会默认以整数的形式输出。我们也可以用 \lstinline@cout.setf(ios_base::boolalpha)@ 来让它以布尔值的方式输出。\par
149-
但是这里有另一个问题:尖括号中只能接收类型信息,我们不能直接把一个变量,或者引用,或者指针塞进去。这时我们就要用到 \lstinline@decltype@ 了。\lstinline@decltype@ 是一个编译时操作,它会解释出一个表达式的类型。
149+
但是这里有另一个问题:尖括号(Angle brackets)中只能接收类型信息,我们不能直接把一个变量,或者引用,或者指针塞进去。这时我们就要用到 \lstinline@decltype@ 了。\lstinline@decltype@ 是一个编译时操作,它会解释出一个表达式的类型。
150150
\begin{lstlisting}
151151
int num;
152152
cout << is_same<decltype(num), int>::value; //将输出1

generalized_parts/08_a_step_forward_in_classes_and_functions/02_member_functions_and_friend.tex

+11-11
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ \section{成员函数与友元函数}
3131
#include <initializer_list>
3232
class valarri {
3333
public:
34-
valarri(const std::initializer_list<int> &initl) { //留到下一节再讲
34+
valarri(const std::initializer_list<int> &ilist) { //留到下一节再讲
3535
_size = 0;
36-
for (int x : initl)
36+
for (int x : ilist)
3737
_arr[_size++] = x;
3838
}
39-
//...
39+
//...待补充
4040
private:
41-
static const std::size_t MAX_SIZE {100};
42-
int _arr[MAX_SIZE];
43-
std::size_t _size;
41+
static const std::size_t MAX_SIZE {100}; //最大容量
42+
std::size_t _size; //前当的数据存储量
43+
int _arr[MAX_SIZE]; //一个数组用来存放数据
4444
};
4545
\end{lstlisting}
4646
其中的 \lstinline@valarri@ 成员是一个构造函数,我们会在下一节中介绍构造函数相关的知识。这里读者不必纠结,直接把它抄进 \lstinline@valarri@ 类的定义中就可以了。\par
@@ -94,9 +94,9 @@ \subsection*{成员函数的声明与定义}
9494
int sum(); //声明max, min和sum
9595
//...待补充
9696
private:
97-
static const std::size_t MAX_SIZE{ 100 };
98-
int _arr[MAX_SIZE];
99-
std::size_t _size;
97+
static const std::size_t MAX_SIZE {100}; //最大容量
98+
std::size_t _size; //前当的数据存储量
99+
int _arr[MAX_SIZE]; //一个数组用来存放数据
100100
}; //这样就整洁多了吧
101101
\end{lstlisting}
102102
这个部分的内容可以放到头文件中。\par
@@ -128,9 +128,9 @@ \subsection*{成员函数的声明与定义}
128128
summation += _arr[i];
129129
return summation;
130130
}
131-
valarri::valarri(const std::initializer_list<int> &initl) {
131+
valarri::valarri(const std::initializer_list<int> &ilist) {
132132
_size = 0;
133-
for (int x : initl) {
133+
for (int x : ilist) {
134134
_arr[_size] = x;
135135
++_size;
136136
}

0 commit comments

Comments
 (0)