c++刚学习,一头雾水。记录一下。代码来自https://github.com/Mooophy/Cpp-Primer
文件列表:
// main.cpp
#include <iostream>
#include <string>
#include "quote.h"
#include "bulk_quote.h"
// 声明print_total函数,使用前先声明,其中输入有三项
// std::ostream& os表示定义了一个输出操作,可以看成:
// std::ostream& os = std::cout;
// 那么os就具有了std::cout的功能;
// const Quote& item定义了一个类item,则传给item的必须是一个Quote的
// 类的一个实例对象。
double print_total (std::ostream& os, const Quote& item, size_t n);
int main()
{
// 实例两个派生类
Quote q("textbook", 10.60);
Bulk_quote bq("textbook", 10.60, 10, 0.3);
// 由于动态绑定,函数会自动调用对应的函数
print_total(std::cout, q, 12);
print_total(std::cout, bq, 12);
return 0;
}
double print_total(std::ostream &os, const Quote &item, size_t n)
{
double ret = item.net_price(n); // item是一个类,具有Quote的所有属性
os << "ISBN:" << item.isbn()
<< "# sold: " << n << " total due: " << ret << std::endl;
return ret;
}
// quote.h
#ifndef QUOTE_H
#define QUOTE_H
/* ifndef 是一个头文件保护符,如果没有定义QUOTE_H则执行后面的程序到#endif结束。
* 第一次包含这个头文件会发现没有定义QUOTE_H,那么则用#define定义。
* 之后在有其他函数包含这个头文件时就会发现已经定义了QUOTE_H。则会跳过下面的定义。
* 防止多个函数重复调用导致的重复定义。
*/
#include <string>
class Quote
{
public:
Quote() = default; // 定义Quote为一个默认的构造函数。
/* 下面是对Quote这个类的初始化列别,输入包括一个字符和一个double类型数
* const std::string &b定义了一个常量字符类型,说明字符b后面不能被改变
* &b有一个引用符号&说明传入的应该为一个字符对象。
* double p说明传给p的应该是一个double类型的数字(没有&应该就不是对象了吧)。
* 一个:后面跟着bookNo(b), price(p)是类的初始化类别,将b传值给bookNo,
* 说明bookNo也应该是一个字符类型。
*/
Quote(const std::string &b, double p) :
bookNo(b), price(p) { }
/*这一句是一个函数定义,函数名为isbn,输出是一个string类型。
* 函数名称后面有一个const说明这个函数是只读的,内容不可改。
*/
std::string isbn() const { return bookNo; }
/*这一句是类派生列表,virtual是值后面的函数是一个虚函数,即基类函数Quote函数
* 希望他的继承函数(派生函数)可以改变这个net_price函数。
*/
virtual double net_price(std::size_t n) const { return n * price; }
/*对析构造函数进行动态绑定,设置了动态绑定可以多处继承这个基函数,并且允许
*派生函数对内部某些函数进行重写,在调用时根据输入值自动选取对应函数。
*/
virtual ~Quote() = default;
private:
std::string bookNo;
// 派生函数可以调用protected下属性
protected:
double price = 0.0;
};
#endif // QUOTE_H
// quote.cpp
#include "quote.h"
// bulk_quote.h
#ifndef BULK_QUOTE_H
#define BULK_QUOTE_H
#include "quote.h"
/*class Bulk_quote : public Quote是类的继承写法,
* Quote是基类(父函数),Bulk_quote是派生函数(子函数)
* public表示对基类属性使用权限的说明。也可以是protected,private。
*/
class Bulk_quote : public Quote
{
public:
Bulk_quote() = default;
Bulk_quote(const std::string& b, double p, std::size_t q, double disc) :
Quote(b, p), min_qty(q), discount(disc) { }
double net_price(std::size_t n) const override;
private:
std::size_t min_qty = 0;
double discount = 0.0;
};
#endif // BULK_QUOTE_H
// bulk_quote.cpp
#include "bulk_quote.h"
// 对函数的重写,同一个名称函数定义了不同功能,并且下面的price、min_qty
// 是不需要再次声明的可以直接使用。因为派生类函数可以使用基类函数的属性。
double Bulk_quote::net_price(std::size_t n) const
{
return n * price * ( n >= min_qty ? 1 - discount : 1);
}
// 运行(需要执行main.cpp和bulk_quote.cpp两个函数,因为会用到bulk_quote.cpp内容):
g++ -std=c++11 -o main main.cpp bulk_quote.cpp
生成main可执行文件./main
有问题后续修改...