C++ Primer 第五版 读书笔记 第一章 开始

下面是C++ Primer第一章的读书笔记

————————————————————————

0001.操作系统如何运行C++程序
操作系统通过调用main来运行C++程序

0002.main
操作系统执行一个C++程序时所调用的函数
每个程序必须有且只有一个命名为main的函数

0003.函数
function
具名的计算单元

0004.C++函数的定义
C++函数的定义包含4部分:
返回类型:return type
函数名:function name
形参列表:parameter list,括号包围,允许为空
函数体:function body

0005.语句
statement
程序的一部分,指定了当程序执行时进行什么操作

0006.语句块
block
零条或多条语句的序列
用花括号包围

0007.花括号
curly brace
花括号用于划定程序块边界
左花括号{为程序块开始,右花括号}为结束

0008.函数名
function name
函数为人所知的名字
也用来进行函数调用

0009.形参列表
parameter list
函数定义的一部分
指出调用函数时可以使用什么样的实参
可能为空列表

0010.参数
实参,argument
向函数传递的值

0011.返回类型
return type
函数返回值的类型

0012.函数体
function body
一个以左花括号开始,以右花括号结束的语句块
定义了函数所执行的动作

0013.main函数的返回类型
必须为int,即整数类型
int是c++内置类型(build-in type)

0014.类
class
一种用于定义自己的数据结构及其相关操作的机制
是C++中最基本的特性之一
标准库类型中,istream/ostream都是类

0015.return语句
return语句结束函数的执行
还可以向调用者返回一个值
返回值的类型必须与函数的返回类型相容

0016.常见的c++程序源文件后缀名
.cc .cxx .cpp .cp .C

0017.源文件
source file
包含C++程序的文件

0018.运行GNU编译器的命令
g++ -o prog1 prog1.cpp
-o prog1 是编译器参数,指定了可执行文件的文件名

0019.c++语言的IO机制
C++语言并未定义任何输入输出语句
而是包含可一个全面的iostream库来提供IO机制

0020.iostream库包含的基础类型
两个基础类型istream和ostream
分别表示输出流和输出流
一个流是一个字符序列
随着时间的推移
字符是顺序生成或消耗的

0021.库类型
library type
标准库定义的类型
如istream

0022.标准库
standard library
一个类型和函数的集合,每个C++编译器都必须支持

0023.iostream
头文件
提供了面向流的输入输出的标准库类型

0024.istream
提供了面向流的输入的库类型

0025.ostream
标准库类型
提供面向流的输出

0026.标准输入输出对象
标准库定义了4个IO对象
cin:标准输入
cout:标准输出
cerr:标准错误
clog:输出一般性信息

0027.cin
一个istream对象
用来从标准输入读取数据

0028.cout
一个ostream对象,用于将数据写入标准输出
通常用于程序的正常输出内容

0029.cerr
一个ostream对象
关联到标准错误
通常用于输出错误信息或其他不属于程序正常逻辑的输出内容
默认不缓冲

0030.clog
一个ostream对象
关联到标准错误
通常用于报告程序的执行信息,存入一个日志文件中
默认是被缓冲的

0031.标准输入
standard imput
输入流
通常与程序执行所在窗口相关

0032.标准输出
standard output
输出流
通常与程序执行所在窗口相关联

0033.标准错误
standard error
输出流
用于报告错误
通常与程序执行所在窗口相关联

0024.使用IO库,提示用户输入两个数,然后输出它们的和
#include <iostream>
int main()
{
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0 , v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "Then sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;
    
    return 0;
}


0025.#include
头文件包含指令
#include指令告诉编译器想要使用的库
使头文件中代码可被程序使用

0026.头文件
header
使类或其他名字的定义可被多个程序使用的一种机制
程序通过#include指令使用头文件
每个使用标准库的程序都必须包含相关的头文件

0027.#include指令的用法
在尖括号中指出头文件
#include指令和头文件的名字必须写在同一行
通常情况下,#include指令必须出现在所有函数之外
一般将一个程序的所有#include指令都放在源文件的开始位置

0028.赋值
assignment
抹去一个对象的当前值
用一个新值取代之

0029.未初始化的变量
uninitialized variable
未赋予初值的变量
除非有显式的初始化语句,定义在函数内部的内置类型变量默认是不初始化的
试图使用一个未初始化变量的值是错误的
未初始化变量是bug的常见成因

0030.在标准输出上打印消息“Enter two numbers:”的语句
std::cout << "Enter two numbers:" << std::endl;

0031.<<运算符
<< operator
输出运算符是将右侧运算对象的值写到左侧运算对象表示的输出流
<<运算符接受两个运算对象:
左侧的对象必须是一个ostream对象
右侧的对象是要打印的值
输出运算符可以连接
此时前方运算符的结果顺序作为后方运算符的左侧运算对象

0032.输出运算符示例
cout<<"hi"
表示将hi写到标准输出。
cout<<"hi"<<"bye"
表示将输出hibye

0033.字符串常量
string literal
零或多个字符组成的序列,用双引号包围

0034..字符串字面值常量
character string literal
string literal的另一种叫法
是用一对双引号包围的字符序列

0035.操纵符
manipulator
对象,如std::endl
在读写流的时候用来“操纵”流本身

0036.输出运算符打印endl的效果
1.结束当前行
2.将与设备关联的缓冲区中的内容刷新到设备中

0037.缓冲区
buffer
一个储存区域,用于保存数据
IO设备通常将输入(或输出)数据保存在缓冲区中
读写缓冲区的动作与程序中的动作无关
默认情况下
读cin或程序非正常终止时都会刷新cout

0038.调试程序时使用打印语句的注意事项
调试程序时添加的打印语句应该一直使用endl操纵符刷新流
否则如果程序崩溃
输出可能还留在缓冲区
从而导致错误推断程序崩溃位置

0039.命名空间
namespace
将库定义的名字放在一个单一位置的机制
可以帮助避免名字冲突
C++标准库的命名空间为std

0040.std
标准库所使用的命名空间

0041.::运算符
:: operator
作用域运算符
其用处之一是访问命名空间中的名字

0042.::运算符示例
std::cout表示使用定义在命名空间std中的名字cout
使用作用域运算符指明使用定义在命名空间std中的名字cout

0043.>>运算符
>> operator
输入运算符
从左侧运算对象所指定的输入流读取数据
存入右侧运算对象中
输入运算符可以连接

0044.输入运算符示例
cin>>i
表示从标准输入读取下一个值存入i中
cin>>i>>j
表示先读取一个值存入i
再读取一个值存入j

0045.编写程序,在标准输出上打印Hello,world
#include<iostream>

int main(){
    std::cout<< "Hello, world"<<std::endl;
}

0046.编写程序,使用乘法运算符*,来打印两个数的积
#include<iostream>

int main(){
    int a,b;
    std::cin>>a>>b;
    std::cout<< a * b <<std::endl;
}

0047.注释
comment
被编译器忽略的程序文本

0048.c++的两种注释
以//开始的单行注释,从//到行尾的内容都是注释
以/*开始*/结尾的界定符对注释,注释界定符不能嵌套

0049.指出合法输出语句,改编译错误
std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /*"*/" /*"/*"*/;
1/2/4合法,3去掉引号外的界定符

0050.while语句
while statement
迭代语句,提供重复执行直至一个特定条件为假的机制

0051.用while编写一段程序,求1~10这10个数之和
#include<iostream>

int main()
{
    int sum = 0, val = 1;
    while (val <= 100) {
        sum += val;
        ++val;
    }
    std::cout<< "Sum of 1 to inclusive is "<< sum << std::endl;
    return 0;
}

0052.while语句的执行过程
交替地检测condition(条件)和执行相关联的statement(语句),
直至condition为假时停止

0053.条件
condition
求值结果为真或假的表达式
通常用值0表示假,用非零值表示真

0054.表达式
expression
最小的计算单元
一个表达式包含一个或多个运算对象
通常还包括一个或多个运算符
表达式求值会产生一个结果

0055.<=运算符
<= operator
小于等于运算符
检测左侧运算对象是否等于右侧运算对象

0056.>=运算符
>=operator
大于等于运算符
检测左侧运算对象是否大于等于右侧运算对象

0057.+=运算符
+= operator
复合赋值运算符
将右侧运算对象加到左侧运算对象上
a+=b 等价于 a=a+b

0058.++运算符
++ operator
递增运算符
将运算对象的值加1
++i 等价于 i=i+1

0059.编写程序,使用while将50到100的整数相加
#include<iostream>

int main() {
    int var = 50, sum = 0;
    while (var <= 100){
        sum += var;
        ++var;
    }
    std::cout << sum << std::endl;
}

0060.--运算符
-- operator
递减运算符
将运算对象的值减1
--i等价于i=i-1

0061.编写程序使用递减运算符在循环中按递减顺序打印出10到0之间的整数
#include<iostream>

int main(){
    int var = 9;
    while (var > 0){
        std::cout << var << std::endl;
        --var;
    }
    return 0;
}

0062.>运算符
> operator
大于运算符
检测左侧运算对象是否大于右侧运算对象

0063.<运算符
< operator
小于运算符
检测左侧运算对象是否小于右侧运算对象

0064.编写程序,提示用户输入两个整数,打印出这两个整数所指定范围的所有整数
#include<iostream>

int main(){
    int var1,var2;
    std::cin >> var1 >> var2;
    while (var1 > var2+1){
        --var1;
        std::cout << var1 << std::endl;        
    }
    while (var2 > var1+1){
        --var2;
        std::cout << var2 << std::endl;        
    }
    return 0;
}

0065.for 语句
for statement
迭代语句
提供重复执行能力
通常用来将一个计算反复执行指定次数

0066.用for语句来重写从1加到10的程序
#include<iostream>

int main(){
    int sum = 0;
    for (int val = 1; val <= 10; ++val)
        sum += val;
    std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
    return 0;
}

0066.for语句包含的部分
每个for语句都包含两部分
循环头和循环体

0067.for语句循环头的作用和组成
循环体控制循环体的执行次数
由三部分组成:
初始化语句:init-statement
循环条件:condition
表达式:expression

0068.初始化
initialize
在一个对象创建的时候赋予它一个值

0069.下面的for循环完成了什么功能?sum的最终值是多少?
int sum = 0;
for (int i = -100; i <= 100; ++i)
    sum += i;

0070.对用户输入的一组数求和,不断读取数据直至没有新的输入为止
#include<iostream>

int main(){
    int sum = 0, value = 0;
    while (std::cin >> value)
        sum += value;
    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

0071.使用istream对象作为条件时的效果
当遇到文件结束符或无效输入时
istream对象的状态会变为无效
处于无效状态的istream对象会使条件变为假

0072.文件结束符
end-of-line
系统特定的标识
指出文件中无更多数据了

0073.从键盘输入文件结束符
windows系统中,输入文件结束符的方法是Ctrl+Z然后Enter
UNIX系统中是Ctrl+D

0074.常见的编译器可以检查出的错误
语法错误(syntax error)
类型错误(type error)
声明错误(declaration error)

0075.常见的语法错误
漏掉函数的参数列表
语句结尾使用冒号而非引号
字符串两侧漏掉引号
漏掉分号

0076.类型错误例子
向一个期望参数为int的函数传递了一个字符串字面值常量

0077.常见声明错误
对来自标准库的名字忘记使用std::
标识符名字拼写错误

0078.编辑-编译-调试
edit-compile-debug
使程序能正确执行的开发过程
每修正一个错误就立即重新编译代码
或者最多是修正了一小部分明显的错误后就重新编译

0079.if语句
if statement
根据一个特定条件的值进行条件执行的语句
如果条件为真,执行if语句体
否则执行else语句体(可选)

0080.使用if语句写一个程序,来统计在输入中每个值连续出现了多少次
测试数据:42 42 42 42 42 55 55 62 100 100 100
期待输出:
    42 occurs 5 times
    55 occurs 2 times
    62 occurs 1 times
    100 occurs 3 times
    
#include<iostream>

int main(){
    int currVal = 0, val = 0;
    if (std::cin >> currVal){
        int cnt = 1;
        while (std::cin >> val){
            if (val == currVal)
                ++cnt;
            else{
                std::cout << currVal << " occurs " << cnt << " times" << std::endl;
                currVal = val;
                cnt = 1;
            }
        }
        std::cout << currVal << " occurs " << cnt << " times"<< std::endl;
    }
    return 0;
}

0081.==运算符
== operator
相等运算符
检测左侧运算对象是否等于右侧运算对象

0082.=运算符
= operator
将右侧运算对象的值赋予左侧运算对象所表示的对象

0083.条件中的常见错误
一个常见错误是想在条件中使用==(相等判断),却误用了=

0084.C++程序的缩进和格式
C++程序在很大程度上是格式自由的
在哪里放置花括号、缩进、注释以及换行符通常不会影响程序的语义
不存在唯一正确的风格,但保持一致性是非常重要的

0085.数据结构
data structure
数据及其所允许操作的逻辑组合

0086.C++中如何定义数据结构
通过定义一个类(class)来定义数据结构
一个类定义了一个类型,以及与其相关联的一组操作

0087.内置类型
built-in type
由语言定义的类型,如int

0088.类类型
class type
类定义的类型
类名即为类型名
一种类型不仅定义了数据元素的内容
还定义了这类数据上可以进行的运算

0089.头文件的作用和命名
需要使用头文件来访问为自己的应用程序所定义的类
习惯上,头文件根据其中定义的类的名字来命名
通常使用h作为头文件的后缀

0090.使用类时需要了解的三件事
类名是什么
在哪里定义
支持什么操作

0091.Sales_item类的作用
Sales_item类的作用是表示一本书的总销售额、售出册数和平均售价

0092.定义item为Sales_item类对象
Sales_item item;

0093.Sales_item类支持的操作
调用isbn函数从Sales_item对象中提取ISBN书号
用输入运算符和输出运算符读写Sales_item对象
用赋值运算符将一个Sales_item对象的值赋予另一个Sales_item对象
用加法运算符将两个Sales_item对象相加。两个对象的ISBN必须相同,加法结果是一个新的Sales_item对象,其ISBN与两个运算对象相同,而总销售额和售出册数是两者之和
使用复合赋值运算符将一个Sales_item对象加到另一个对象上

0094.编写程序从标准输入读入数据,存入Sales_item对象,然后将Sales_item的内容写回标准输出
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item book;
    std::cin >> book;
    std::cout << book << std::endl;
    return 0;
}

0095.#include指令的两种形式
包含来自标准库的头文件时,应该用尖括号包围头文件名
对于不属于标准库的头文件,则用双引号包围

0096.输入两个Sales_item对象相加并打印它们的和
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item item1,item2;
    std::cin >> item1 >> item2;
    std::cout << item1 + item2 << std::endl;
    return 0;
}

0097.文件重定向机制
大多数操作系统支持文件重定向
这种机制将标准输入与标准输出与命名文件关联起来

0098.文件重定向样例
addItems <infile >outfile
addItems为可执行文件
从名为infile的文件读取销售记录
将输出结果写入到名为outfile的文件中
两个文件位于当前目录

0099.写出将两个Sales_item对象相加的程序
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item item1,item2;
    std::cin >> item1 >> item2;
    if (item1.isbn() == item2.isbn()) {
        std::cout << item1 + item2 << std::endl;
        return 0;
    } else {
        std::cerr << "Data must refer to same ISBN" << std::endl;
        return -1;
    }
}

0100.成员函数
member function
类定义的操作
是定义为类的一部分的函数,有时也被称为方法
通常通过调用成员函数来操作特定对象

0101.方法
method
成员函数的同义术语

0102..运算符
. operator
点运算符
左侧运算对象必须是一个类类型对象
右侧运算对象必须是此对象的一个成员的名字
运算结果即为该对象的这个成员

0103.()运算符
() operator
调用运算符
跟随在函数名之后的一对括号,起到调用函数的效果
传递给函数的实参放置在括号内(可以为空)

0104.编写程序从文件中读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价(假定每个ISBN书号的所有销售记录在文件中是聚在一起的)
#include <iostream>
#include "Sales_item.h"

int main(){
    Sales_item total;
    if (std::cin >> total) {
        Sales_item trans;
        while (std::cin >> trans){
            if (total.isbn() == trans.isbn())
                total += trans;
            else {
                std::cout << total << std::endl;
                total = trans;
            }
        }
        std::cout << total << std::endl;
    } else {
        std::cerr << "No data?!" << std::endl;
        return -1;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值