3. 类 class
C++ 语言的类(class) 本质就是结构体,他用专有的关键字 class 声明称为类。类与结构体不同之处在于默认类内的成员函数和成员变量都是私有的(private),如果需要指定为特殊的访问权限,需要使用访问说明符 public、protected或 private 类指定访问权限。
C++ 类的作用同结构体一样,用来创建一个自定义的类型。
声明类语法
class 类名 {
//访问说明符
public:
// 此处定义成员变量或成员函数。
protected:
// 此处定义成员变量或成员函数。
private:
// 此处定义成员变量或成员函数。
};
说明:
- 类名必须是一个标识符。按编码规范,类名都使用单词首字母大写的标识符(即大驼峰命名法)
- 类的定义的语法后必须加分号(
;)(和结构体相同)。 - 访问说明符用户控制类内成员的访问权限。有三种:
public表示类内成员函数和非成员函数都可以访问。protected表示类内成员函数和子类成员函数可以访问,非成员函数不可以访问。private表示类内成员函数可以访问,子类成员函数和非成员函数不可以访问。
- 成员函数可以定义在类内和类的外部。
- 类和C++结构体的区别
- 类的成员(变量或函数)默认的访问权限是私有(
private)。 - 结构体的成员(变量或函数)默认的访问权限是共有(
public)。
- 类的成员(变量或函数)默认的访问权限是私有(
成员变量
同 C 语言的结构体成员变量相同。
成员函数:
是定义在类内的函数,名字空间属于类,需要使用该类的对象来调用。
成员函数的调用语法
对象.成员函数名(实际参数列表...)
说明
- 成员函数同 C 语言的函数一样,可以有参数和返回值。
- 成员函数的调用是一个表达式(同C语言)。
- 按习惯,C++语言的成员函数一般使用驼峰命名法(建议使用小驼峰)。
示例
定义一个矩形类 Rectangle(即:长方形类);此矩形有两个私有的成员变量width和 height用来保存此矩形的长和宽。此矩形有个三个成员函数,其中 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 中的成员变量 width 和 height 的访问权限。然后尝试在 main 函数中访问这些成员变量,总结 public、protected 和 private 的区别。