美文网首页
《C++ Primer Plus》:对象和类

《C++ Primer Plus》:对象和类

作者: Dragon_boy | 来源:发表于2020-07-29 16:31 被阅读0次

    OOP特性:

    • 抽象
    • 封装和数据隐藏
    • 多态
    • 继承
    • 代码的可重用性

    类定义和实现

    C++使用class关键字定义类:

    class Stock
    {
    public:
        void update(double price);
        int GetA(){return m_A;}
    private:
        int m_A;
    };
    

    类中的默认的访问控制权限是private,标识只能通过公共成员访问的类成员,往往用来标识数据和内部使用的方法。public是公有的标识。

    实现类中方法时,使用::作用域解析符,类中方法可访问private成员,比如其中一个类方法的函数头:

    void Stock::update(double price)
    

    如果函数定义在类定义中,那么这个函数就是一个内联函数,比如Stock::GetA()。常将短小的成员函数作为内联函数。如果要将内联函数在类定义外定义,则函数原型加上inline关键字。

    构造函数和析构函数

    应为类提供构造函数和析构函数。构造函数与类名同名:

    class Stock
    {
    public:
        Stock(const string& co, long n = 0, double pr = 0.0);
    };
    

    注意,构造函数中的形参名不能和类成员数据名相同,否则会造成混乱错误。我们往往使用m_前缀。

    创建对象时可以显式的调用构造方法:

    Stock food = Stock("World Cabbage", 250, 1.25);
    

    也可以隐式的调用:

    Stock garment("Funny Mason", 50, 2.5);
    

    创建类对象时也可以使用new来动态分配内存:

    Stock *pstock = new Stock("Electroshock Games", 18, 19.0);
    

    如果没有提供构造函数,C++会使用默认的空构造函数:

    Stock fluffy_the_cat;  //uses:Stock::Stock(){}
    

    注意,必须是没有提供任何自定义的构造函数,才会自动创建默认构造函数。

    用构造函数创建对象后,程序会跟踪该对象,当对象过期时,程序会自动调用析构函数来清理对象的内存。例如,如果构造函数使用new分配内存,则析构函数使用delete来释放内存。如果没有使用new,则创建一个空析构函数即可。

    析构函数的名称为~类名:

    ~Stock();
    

    成员函数定义时,可以在末尾使用const关键字:

    void show() const;
    
    void Stock::show() const{}
    

    这里的const关键字意义是保证函数不会修改对象,这种函数称为const成员函数。

    this指针

    this指针指向用来调用成员函数的对象,即当前对象本身。所有的类方法将this指针设置为调用它的对象的地址。每个成员函数都有一个this指针,如果要引用整个调用对象,可以使用*this

    类作用域

    在类中定义的名称的作用域都为整个类。要调用公有成员函数,也必须通过对象。

    类中无法直接定义符号常量:

    class Bakery
    {
    private:
        const int Months  = 12;  //invalid
    };
    

    因为类只是描述了对象的形式,并没有创建对象,所以在对象创建前,没有用于存储的空间。

    不过可以使用枚举来实现:

    class Bakery
    {
    private:
        enum {Months  = 12};  //invalid
    };
    

    但这并不是成员数据,只是在遇到Months时会用12代替。

    还可以使用static来定义符号常量:

    class Bakery
    {
    private:
        static const int = 12;  //invalid
    };
    

    这样的话常量就定义在类中,其它静态变量存储在一起,与而不是存储在对象中。

    传统的枚举会有冲突,比如两个枚举都有相同的某个值,并在同一作用域内,就会发生冲突:

    enum egg{Small};
    enum t_shirt{Small};  //冲突
    

    C++提供了新的枚举类,作用域为类:

    enum class egg {Small};
    enum class t_shirt {Small};
    

    可以这么用:

    egg choice = egg::Small;
    t_shirt Floyd = t_shirt::Small;
    

    相关文章

      网友评论

          本文标题:《C++ Primer Plus》:对象和类

          本文链接:https://www.haomeiwen.com/subject/ypahrktx.html