3. 类 class

C++ 语言的类(class) 本质就是结构体,他用专有的关键字 class 声明称为类。类与结构体不同之处在于默认类内的成员函数和成员变量都是私有的(private),如果需要指定为特殊的访问权限,需要使用访问说明符 publicprotectedprivate 类指定访问权限。

C++ 类的作用同结构体一样,用来创建一个自定义的类型。

声明类语法

class 类名 {
    //访问说明符
    public:
        // 此处定义成员变量或成员函数。
    protected:
        // 此处定义成员变量或成员函数。
    private:
        // 此处定义成员变量或成员函数。
};

说明:

成员变量

同 C 语言的结构体成员变量相同。

成员函数:

是定义在类内的函数,名字空间属于类,需要使用该类的对象来调用。

成员函数的调用语法

对象.成员函数名(实际参数列表...)

说明

示例

定义一个矩形类 Rectangle(即:长方形类);此矩形有两个私有的成员变量widthheight用来保存此矩形的长和宽。此矩形有个三个成员函数,其中 set_width_height 用来修改句型的长和宽,get_area 用来获取此矩形的面积,get_length 用来获取矩形的周长。代码如下:

// filename: cpp_class.cpp
#include <iostream>

using namespace std;

class Rectangle {
    public:
        void set_width_height(int w, int h) {
            width = w, height = h;
        }
        int get_area(void) {
            return width * height;
        }
        int get_length(void) {
            return  (width + height) * 2;
        }
    private:
        int width;
        int height;
};

int main(int argc, char * argv[]) {
    Rectangle r1;

    r1.set_width_height(10, 2);
    cout << "r1的周长:" << r1.get_length() << endl;
    cout << "r1的面积:" << r1.get_area() << endl;
    // cout << get_length() << endl; // 报错,get_length 是成员函数,不是函数。
    // cout << r1.width << endl; // 报错,main 函数不能访问私有成员变量。

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o cpp_class cpp_class.cpp
weimz@mzstudio:~$ ./cpp_class 
r1的周长:24
r1的面积:20

以上是使用 C++ 的类来封装 Rectangle 类,在 C 语言中也同样可以使用结构体来实现,不同之处在于 C 语言的结构不能有成员函数,需要将成员函数改写成全局函数的方式来实现。改写后的代码如下:

// filename: c_struct.cpp
#include <iostream>

using namespace std;

struct rectangle {
    int width;
    int height;
};
void set_width_height(struct rectangle * r, int w, int h) {
    r->width = w, r->height = h;
}
int get_area(struct rectangle * r) {
    return r->width * r->height;
}
int get_length(struct rectangle * r) {
    return (r->width + r->height) * 2;
}

int main(int argc, char * argv[]) {
    struct rectangle r1;
    // r1.set_width_height(10, 2);
    set_width_height(&r1, 10, 2);
    cout << "r1的周长:" << get_length(&r1) << endl;
    cout << "r1的面积:" << get_area(&r1) << endl;
    cout << r1.width << endl;  // 正确,C 语言结构体不限制权限。

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o c_struct c_struct.cpp
weimz@mzstudio:~$ ./c_struct 
r1的周长:24
r1的面积:20
10

可见在 C 语言中也同样可以使用结构体来实现 C++ 中类的定义,不同之处在于 C 语言的结构体所有的成员变量都是共有访问权限,任何代码都能修改成员变量,容易出现错误漏洞并不利于大型软件的编写。

实验

改写类 class Rectangle 中的成员变量 widthheight 的访问权限。然后尝试在 main 函数中访问这些成员变量,总结 publicprotectedprivate 的区别。