C++ Primer chapter 1
- main函数的返回值在正常情况下为0,程序错误时可能返回其他的值 。
- 在编译程序时,命令行只需要包含源文件的参数
//test.hpp void test() { std::cout<<"test"<<std::endl; } //main.cc #include"test.hpp" int main() { test(); return 0; } g++ main.cc -o main 在编译main.cc程序时会自动加上头文件。 上一段中的编译得到的程序为 main ,命令行中输入 ./main 便可以执行这段代码。./ 代表当前的命令行文件路径。 如果不添加其他参数 只有g++ main.cc会生成a.out默认文件
- 头文件的后缀可以为 .h .hpp ,源文件后缀可以是.cc .cpp .cxx .C等
- iostream库包含两个基本的类型 istream和 ostream,表示输入与输出流。其中包括了4个标准输入输出流
cin 标准输入
cout 标准输出
cerr 输入警告和错误信息,也叫做标准错误
clog 程序运行时输出一般性的信息 - 附程序代码
//Sales_item.h #ifndef SALES_ITEM_H_ #define SALES_ITEM_H_ #include<iostream> #include<string> class Sales_item { //四个友元函数的定义,二元运算符号,返回的并不是Sales_item对象 //运算符的重载,注意const修饰//友元函数并不是类中的函数,而是外部函数,可以直接调用类中的函数以及变量 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&); private: std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; public: Sales_item& operator+=(const Sales_item&); std::string isbn() const {return bookNo;}//ISBN double avg_price() const; }; //重载+,先定义后使用 Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs); //inline表示这个函数为内联函数,编译之前直接替换,会造成代码膨胀 inline bool compareIsbn(const Sales_item& lhs,const Sales_item& rhs) { return lhs.isbn() == rhs.isbn(); } //因为==已经是友元函数,所以!=函数里直接使用==函数就可以,不要再将其设置为友元函数 inline bool operator!=(const Sales_item& lhs,const Sales_item& rhs) { return !(rhs==lhs); } //成员函数 Sales_item& Sales_item::operator+=(const Sales_item& rhs) { units_sold+=rhs.units_sold; revenue += rhs.revenue; return *this; } double Sales_item::avg_price() const { if(units_sold) return revenue/units_sold; return 0; } Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs) { Sales_item ret(lhs); ret+=rhs; return ret; } //友元函数 std::istream& operator>>(std::istream& in,Sales_item& s) { //可以把这里的in 看成cin,其实cin也是一个类,其中>>被重载 double price; //连续输入3个变量 //这里为友元函数 可以直接调用s的所有成员函数/变量 in>>s.bookNo>>s.units_sold>>price;//结合性为自左向右 if(in)//如果in合法 s.revenue = s.units_sold*price; else s = Sales_item(); //输入输出流的重载函数中返回的是 输入输出对象 return in; } std::ostream& operator<<(std::ostream& out,const Sales_item& s) { out<<s.isbn()<<" "<<s.units_sold<<" "<<s.revenue<<" "<<s.avg_price()<<std::endl; return out; } inline bool operator==(const Sales_item& lhs,const Sales_item& rhs) { return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.isbn() == rhs.isbn(); } #endif