Primer 意思为入门书,初级读本
第一章 快速入门
1.1 编写简单的C++ 程序
每个C++程序都包含一个或多个函数,而且必须有一个命名为main,main函数是唯一被操作系统显式调用的函数,返回0值表明程序成功执行完毕,返回值必须是int型,int类型是内置类型(由C++语言定义的,也叫基本类型)
调用GUN编译器的默认命令是g++,微软编译器采用命令c1来调用
1.2 输入/输出
C++并没有直接定义进行输入或输出的任何语句,这个功能 是由标准库提供 的,格式化输入和输出的是iostream库,表示输入输出流," 流 "说明读入或写出的字符序列是随着时间顺序生成或消耗的
1.2.1 标准输入与输出对象
cin标准输入,cout标准输出,cerr标准错误,clong产生程序执行的一般信息,大部分操作系统提供了重定向输入或输出流的方法,可以将这些流与选择的文件联系起来
1.2.2 一个使用IO库的程序
一个表达式 由 一个或几个操作数 和 通常是一个操作符 组成,每个表达式都会产生一个结果,通常是将操作符作用到其操作数所产生的值,当操作符是输出操作符时,结果是左操作数的值,即输出流本身
endl 是一个特殊值,称为操纵符,将它写入输出流时,具有换行的效果,并刷新与设备相关联的缓冲区,忘记刷新输出流可能会造成输出停留在缓冲区
使用命名空间,程序员可以避免无意中使用了库中所定义名字相同的名字,输入操作符 >> ,它接受一个istream对象作为其左操作数,接受一个对象作为其右操作数,它从istream操作数读取数据并保存到右操作数,输入操作符返回其左操作数作为结果
程序中,大部分出现空格的地方可用换行符代替,但是,空格符不允许出现在预处理指示中,字符串字面值中的空格符不能用换行符代替
1.4 控制结构
按编译错误报告的顺序改正错误是个好习惯,操作系统使用不同的值作为文件结束符,windows系统下我们同时键入"ctrl" 和 "z"键,来输入文件结束符
1.5 类的简介
每个类定义一种类型,类型名与类名相同
当使用自定义头文件 时,我们采用双引号把头文件括起来,标准库的头文件 用尖括号括起来,非标准库的头文件 用双引号括起来
1.5.2 初窥成员函数
成员函数,是类定义的函数,有时称为方法,成员函数只定义一次,被视为每个对象的成员 。我们将这些操作称为成员函数,它们在特定的对象上操作
点操作符 通过它的左操作数取得右操作数,左操作数必须是类类型的对象,右操作数必须指定该类型的成员,成员函数作为点操作符的右操作数,调用操作符(() )放在函数名之后
1.6 C++程序
Sales_item.h
#ifndef SALESITEM_H // we're here only if SALESITEM_H has not yet been defined #define SALESITEM_H // Definition of Sales_item class and related functions goes here #include <iostream> #include <string> class Sales_item { // these declarations are explained section 7.2.1, p. 270 // and in chapter 14, pages 557, 558, 561 friend std::istream& operator>>(std::istream&, Sales_item&); friend std::ostream& operator<<(std::ostream&, const Sales_item&); friend bool operator<(const Sales_item&, const Sales_item&); friend bool operator==(const Sales_item&, const Sales_item&); public: // constructors are explained in section 7.1.4, pages 262 - 265 // default constructor needed to initialize members of built-in type Sales_item() = default; Sales_item(const std::string &book): bookNo(book) { } Sales_item(std::istream &is) { is >> *this; } public: // operations on Sales_item objects // member binary operator: left-hand operand bound to implicit this pointer Sales_item& operator+=(const Sales_item&); // operations on Sales_item objects std::string isbn() const { return bookNo; } double avg_price() const; // private members as before private: std::string bookNo; // implicitly initialized to the empty string unsigned units_sold = 0; // explicitly initialized double revenue = 0.0; }; // used in chapter 10 inline bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) { return lhs.isbn() == rhs.isbn(); } // nonmember binary operator: must declare a parameter for each operand Sales_item operator+(const Sales_item&, const Sales_item&); inline bool operator==(const Sales_item &lhs, const Sales_item &rhs) { // must be made a friend of Sales_item return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.isbn() == rhs.isbn(); } inline bool operator!=(const Sales_item &lhs, const Sales_item &rhs) { return !(lhs == rhs); // != defined in terms of operator== } // assumes that both objects refer to the same ISBN Sales_item& Sales_item::operator+=(const Sales_item& rhs) { units_sold += rhs.units_sold; revenue += rhs.revenue; return *this; } // assumes that both objects refer to the same ISBN Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs) { Sales_item ret(lhs); // copy (|lhs|) into a local object that we'll return ret += rhs; // add in the contents of (|rhs|) return ret; // return (|ret|) by value } std::istream& operator>>(std::istream& in, Sales_item& s) { double price; in >> s.bookNo >> s.units_sold >> price; // check that the inputs succeeded if (in) s.revenue = s.units_sold * price; else s = Sales_item(); // input failed: reset object to default state return in; } std::ostream& operator<<(std::ostream& out, const Sales_item& s) { out << s.isbn() << " " << s.units_sold << " " << s.revenue << " " << s.avg_price(); return out; } double Sales_item::avg_price() const { if (units_sold) return revenue/units_sold; else return 0; } #endif
术语:argument(实参),buffer(缓冲区),edit-compile-debug(编辑-编译-调试),bulid-in type(内置类型,如: int ),end-of-file(文件结束符),class type(类类型),curly brace(花括号),library type(标准库类型),manipulator(操纵符,读或写时操纵流本身的对象,比如:endl),parameter list(形参表),string literal(字符串字面值),uninitialized variable(未初始化变量),preprocessor directive(预处理指示,#include是一个预处理器指示),ISBN (International Standard Book Number,国际标准书号)