c++初学.面向对象程序设计

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

有问题后续修改...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值