MENU

【C++】class的基本用法

June 13, 2022 • C/C++

Tips: C++的类相关的内容与java的类比较相似,可以参照着进行学习

C++作为一个面向对象的语言,当然少不了类和对象的概念,那么我们应该如何创建一个类呢?

在C++中,我们可以通过class关键字来创建一个类,其基本结构如下:

类与对象基础

class className {               // 类名
    Access specifiers:          // 访问修饰符
        Date members/variables; // 变量
        Member functions() {}   // 方法
};                              // 以分好结束一个类

按照如上的结构,我们可以尝试写出一个如下的类:

class Box {
    public:
        double m_length;      // 长度
        double m_breadth;     // 宽度
        double m_height;      // 高度
        
        // 成员函数声明
        void setLength(double length); 
        void setBreadth(double breadth);
        void setHeight(double height);

        double getVolume();
};

void Box::setLength(double length) {
    m_length = length;
}

void Box::setBreadth(double breadth) {
    m_breadth = breadth;
}

void Box::setHeight(double height) {
    m_height = height;
}

double Box::getVolume() {
    return m_height * m_length * m_breadth;
}

类写好之后,我们可以通过这样的方式进行实例化:

int main() {
    Box box;
    box.setBreadth(12);
    box.setHeight(13);
    box.setLength(14);

    cout << box.getVolume() << endl;
    return 0;
}

这样一个简单的类就写好了,但是,在我们的类里面,还需要调用setxxx函数才能设定长度高度宽度,对于我们这个实例来说,可能过于复杂了,我们可以尝试着使用构造函数来解决这个问题,还是参照上面的例子

构造函数

class Box {
    public:
        double m_length;      // 长度
        double m_breadth;     // 宽度
        double m_height;      // 高度
        
        // 构造函数声明 
        Box();

        // 成员函数声明
        void setLength(double length); 
        void setBreadth(double breadth);
        void setHeight(double height);

        double getVolume();
};

忽略成员函数的实现...

这样我们就声明了一个最简单的构造函数,当然,如果你没有写这个构造函数,C++也会自己帮你写一个默认的构造函数的,所以不用担心;虽然我们写出了这个构造函数,但是对应的功能却依然没有实现,但是为了实现目标的功能,我们只需要再做一点简单的工作

class Box {
    public:
        double m_length;      // 长度
        double m_breadth;     // 宽度
        double m_height;      // 高度
        
        // 构造函数声明
        Box(double length, double breadth, double height);

        // 成员函数声明
        void setLength(double length); 
        void setBreadth(double breadth);
        void setHeight(double height);

        double getVolume();
};

Box::Box(double length, double breadth, double height) {
    m_height = height;
    m_breadth = breadth;
    m_length = length;
}

然后我们就可以通过构造函数简单地声明一个对象了

int main() {
    Box box(12, 13, 14);

    cout << box.getVolume() << endl;
    return 0;
}

当然,构造函数也是可以重载的,所以我们也可以在保留默认构造函数的同时保留上例中的构造函数

class Box {
    public:
        double m_length;      // 长度
        double m_breadth;     // 宽度
        double m_height;      // 高度
        
        // 构造函数声明
        Box(double length, double breadth, double height);
        
        Box(); // 默认构造函数

        // 成员函数声明
        void setLength(double length); 
        void setBreadth(double breadth);
        void setHeight(double height);

        double getVolume();
};

Box::Box(double length, double breadth, double height) {
    m_height = height;
    m_breadth = breadth;
    m_length = length;
}

当然,类似于上例中的那种简单的为class中的每一个成员变量赋值的构造函数,C++也提供了更加简便的写法;

class Box {
    public:
        double m_length;      // 长度
        double m_breadth;     // 宽度
        double m_height;      // 高度
        
        // 构造函数声明
        Box();
        Box(double length, double breadth, double height): m_breadth(breadth), m_height(height), m_length(length){};

        // 成员函数声明
        void setLength(double length);
        void setBreadth(double breadth);
        void setHeight(double height);

        double getVolume();
};

访问修饰符

在C++中,也是存在访问修饰符的,包括(private, protected, public),这仨的区别分别是:

  1. private: 只能被类中的成员访问,无法被外部成员所访问,也无法被派生类所访问
  2. protected: 可以被类中的成员访问,也可以被派生类访问,但是无法被外部成员访问
  3. public:可以被类中的成员、派生类以及外部访问

静态成员变量

在一个类中,我们可以通过静态成员变量的方式来让所有的类共享同一个变量,比如说我们现在有一个兔子类,我们需要统计通过这个兔子类实例化出来的对象的个数,那么我们可以这样写

#include <iostream>
using namespace std;

class Rabbit {
   public:
    static int count;

    Rabbit();
    int getFriendsNum() { return count; }
};

Rabbit::Rabbit() {
    count++;
}

int Rabbit::count = 0;  // 一定记得在使用静态成员变量的时候要先在外面声明

int main() {
    for (int i = 0; i < 10; i++) {
        Rabbit rbt;
        cout << "IDX: " << i << "Num: " << rbt.getFriendsNum() << endl;
    }
    return 0;
}
作者:NorthCity1984
出处:https://grimoire.cn/cpp/cpp-class.html
版权:本文《【C++】class的基本用法》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任