学习笔记

C++PrimerPlus对象和类
Publish: 2018/7/23   

面向对象编程

OOP特性:

类规范有两个部分组成

类的创建
//stock00.h
#ifndef STOCK00_H_
#define STOCKOO_H_

#include <string>

class Stock
{    
private://可选 默认为private
    std::string company;
    long shares;
    double share_val;
    double total_val;
    void set_tot(){total_val=shares*share_val;}
    // 定义位于类声明中的函数都将自动成为内联函数
public:
    Stock();
    Stock(const std::string & co,double pr=0.
0);
    ~Stock();
    void acquire(const std::string & co,long n,double pr);
    void buy(long num,double price);
    void sell(long num,double price);
    void update(double price);
    void show();
}

//set_tot()另一种写法:在类声明之外定义成员函数,并使其成为内联函数
inline void Stock::set_tot()
{
    total_val=shares*share_val;
}
#endif

无论类成员是数据成员还是成员函数,都可以在类的共有部分或私有部分中声明它

所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。

访问控制

实现类成员函数
void Stock::update(double price)
{
    share_val=price;
    set_tot();
}

类的构造函数和析构函数

声明和定义构造函数

会在每次创建类的新对象时执行,构造函数的名称与类名完全相同。

//声明
Stock(const string & co,double pr);

//定义
Stock::Stock(const string & co,double pr)
{
    company=co;//参数名不可以和成员名相同
    share_val=pr;
    set_tot();
}

//使用
Stock food=Stock("World",1.25);
//或
Stock food("World",2.5);
定义默认构造函数

通常应提供所有类成员做隐式初始化的默认构造函数。

析构函数

对象过期时,程序将调用一个特殊的成员函数,称为析构函数。
~Stock();

在下述情况析构函数将被调用

const成员函数

保证函数不会修改调用对象

//原型
void show() const;
//定义
void Stock::show() const{...}

this指针

this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法);

const Stock & Stock::topval(const Stock & s) const
{
    if(s.total_val>total_val)
        return s;
    else
        return *this;//this是对象的地址,*this是对象本身
}

类作用域

作用域为类的常量
class Bakery
{
private:
    const int Months=12;//Fails
    //方式一
    enum {Months=12};
    //方式二 该常量将与其他静态变量存储在一起,而不是存储在对象中
    static const int Months=12;
}
作用域内枚举
//egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突
enum egg{Small,Medium,Large,Jumno};
enum t_shirt{Small,Medium,Large,Xlarge};

C++提供一种新枚举,其枚举量的作用域为类

enum class egg{Small,Medium,Large,Jumno};    //可以使用struct代替class
enum class t_shirt{Small,Medium,Large,Xlarge};

//需要使用枚举名来限定枚举量
egg choice=egg::Large;
t_shirt Floyd=t_shirt::Large;

//作用域内枚举不能隐式地转换为整型
int ring=Floyd;// not allowed
//显示类型转换
int ring=int(t_shirt::Large);

C++作用域内枚举的底层类型为int

//:short指定底层类型为short
enum class : short pizza{Small,Medium};

抽象数据类型ADT

ADT以通用的方式描述数据类型,而没有引入语言或实现细节



← C++PrimerPlus处理数据 C++PrimerPlus类继承 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel