Code:[ZachxPKU/AcceleratedCPlusPlus]
Accelerated C++
Chapter 4 Organizing programs and data
4.1 Organizing computations
- parameter list 参数列表
- call by value 按值调用
4.1.1 Finding medians
- throw an exception
- <stdexcept> 标准异常类
4.1.2 Reimplementing our grading policy
- const vector<double>& reference to vector of const double
const vector<double>& chw = homework
上面的const保证了我们不能做任何改变chw的值的操作。
vector<double>& hw1 = hw;
const vector<double>& chw1 = chw;
上面是为了说明原变量引用的引用也是原变量的引用,只是原变量的另外一个名字。
vector<double>& hw2 = chw; // error: requests write access to chw
同时,我们需要注意上面这一句,我们不能把非const引用指向const变量。(通过“指向”一词,相信已经能想到引用和指针的莫名关系了。)
当函数的形参是const类型引用时,我们传入的参数可以是const的,也可以是非const的。
- overloading 重载
4.1.3 Reading homework grades
A reference parameter without a const usually signals an intent to modify the object that is the function’s argument.
函数中的形参如果是非const引用变量,一般就预示着函数中将会对变量进行改变。
- Ivalue
因为我们传递给非const引用变量的内容,我们需要改变,所以我们不能传给它一个表达式,而要传给它一个Ivalue。
这一节的一些细节是值得好好阅读和研究的!推荐大家仔细阅读。
4.1.4 Three kinds of function parameters
4.1.5 Using functions to calculate a student’s grade
- try-catch 语句
要注意每句statement产生的side effect,特别是对输入输出的影响。这一节写得也不错!
4.2 Organizing data
4.2.1 Keeping all of a student’s data together
4.2.2 Managing the student records
这里定义compare函数,并且传递给sort只是一种解决方法,之后还会看到其他的解决方法。
4.2.3 Generating the report
4.3 Putting it all together
-
separate compilation
-
#ifndef
-
#define
-
#endif
保证头文件只被编译一次,还有一种形式如下:
#pragma once
#pragma once也是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。
#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了。
所以,最保险的方法还是写:
#ifndef
#define
#endif
4.4 Partitioning the grading program
在头文件中,推荐使用如下形式:
std::cin
在源文件中,可以使用如下形式:
using namespace std;
因为,如果在头文件中使用using,会迫使之后包含头文件的其他文件也被动使用using。
4.5 The revised grading program
4.6 Details
- inline function 内联函数
inline function是一种在编译时期展开函数
在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。——百度百科
cout.width( )
- cout.width()用来调整字段宽度,默认为0;cout.width(10)为调整字段宽度为10;
- cout.width()默认为右对齐,且只对后面第一个输入有作用。
- 如果输出的长度超过设定的字段宽度,则设定的字段宽度无效。
#include <iostream>
using namespace std;
int main(){
int x;
cout << "Enter a number: " << endl;
cin >> x;
string s;
cout << "Enter a string: " << endl;
cin >> s;
cout.width(5);
cout << x << endl;
cout << s << endl;
return 0;
}
x的长度没有超过width设定的长度情况下的输入输出结果:
Enter a number:
10
Enter a string:
Zach
10
Zach
x的长度超过width设定的长度情况下的输入输出的结果:
Enter a number:
100000
Enter a string:
Zach
100000
Zach
setw()
- setw()是iomanip里面的函数,作用和cout.width()类似。
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int x;
cout << "Enter a number: " << endl;
cin >> x;
string s;
cout << "Enter a string: " << endl;
cin >> s;
cout << setw(5) << x << endl;
cout << s << endl;
return 0;
}
效果下所示:
Enter a number:
10
Enter a string:
Zach
10
Zach