人生最可悲的事情,莫过于胸怀大志,却又虚度光阴。 ​​​​

《C++ Primer》读书笔记 第1章 开始

2017.01.01

1.1 编写一个简单的C++程序

int main()
{
    return 0;
}

程序源文件命名约定

不同编译器使用不同的后缀命名约定,最常见的包括.cc.cxx.cpp.cp以及.C

从命令行运行编辑器

CC prog1.cc

GUN编译器的命令是

g++ -o prog1 prog1.cc

1.2 输入输出

C++语言并未定义任何输入输出语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制。

标准输入输出对象

C++的iostream库来提供输入和输出。iostream包含istreamostream两个类,分别代表输入流和输出流。 标注库定义了4个io对象。为了处理输入,我们使用一个名为cinistream对象。这个对象被称为标准输入(standard input)。对于输出,我们使用一个名为coutostream类型的对象。此对象也被称为标准输出(standard output)。标准库还定义了其他两个ostream对象,名为cerrclog。通常用cerr来输出警告和错误信息,因此也被称为标准错误(standard error)。而clog用来输出程序运行时的一般性信息。

一个使用IO库的程序

#include <iostream>
int main()
{    
    std::cout << "enter tow numbers" << std::endl;
    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "the sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;
    return 0;
}

向流写入数据

<<是输出运算符,接受两个运算对象:左侧的运算对象必须是一个ostream对象,右侧的运算对象是要打印的值。此运算符将给定的值写个给定的ostream对象中。输出运算符的计算结果就是我们写入给定值的ostream对象。

endl是一个被称为操纵符(manipulator)的特殊值。写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。

使用标准库

std::指出名字coutendl是定义在名为std的命名空间中的。

通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显式说明我们想使用来自命名空间std中的名字。例如,需要写出std::cout,通过使用作用域运算符::来指出我们想要使用定义在命名空间std中的名字cout.

>>是输入运算符,同样接受两个运算对象:左侧运算对象是一个istream对象,右侧是一个对象。此运算符从给定的istream读取数据,并存入给定对象中。输入运算符的计算结果就是给定的istream对象。

1.3 注释

单行注释以双斜线(//)开始,以换行符结束。 多行注释以/*开始以*/结束。

1.4 控制流

1.4.1 While语句

#include "stdafx.h"
#include <iostream>

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

1.4.2 for循环

#include "stdafx.h"
#include <iostream>
int main()
{    
    int sum = 0;
    for (int num = 1; num <= 10; num++) {
        sum += num;
    }
    std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
    return 0;
}

1.4.3 读取数量不定的输入数据

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

从标准输入读取下一个数,保存在value中。输入运算符返回其左侧运算对象,在本例中是std::cin。因此,此循环条件实际上检测的是std::cin

当我们使用一个isstream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假。

1.4.4 if语句

统计输入中每个值连续出现的次数:

#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;
}

1.5类简介

1.5.1 Sales_item类

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