《Accelerated C++》导读(Chapter 4)

Code:[ZachxPKU/AcceleratedCPlusPlus]

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值