类 类型:
-
类类型是什么?
首先说明一下,这个名字看着很怪异,其实第一个‘类’字,和“结构体类型”中的“结构体”是一样的,这个类型就叫类。
可以把世间万物都看成是对象。既然是对象,那么就应该有对象的类型,也就是说可以把把世间万物抽象成类型,然后归类。
在C++中对象的类型称为类(class),用来表示一类具有共同属性和行为的类型。例如:人类,狗类,动物类,哺乳动物类等等。在C++中一般是先声明一个类类型,然后用这个类类型去定义多个对象,所以,对象就是类类型的一个实例,或者说是类类型的一个实例化的变量。
类类型是抽象出来的,所以类类型跟C++中的其他类型一样,不占用内存空间,而对象就是类类型的实例,是真正的变量,所以是占用存储空间的。
-
类类型的声明:
C++中声明一个类类型跟声明一个结构体类型很像。
//一个学生的结构体类型Student,包含学生的一些属性,如:姓名、学好、性别、年龄 struct Student { string name; int num; char sex; int age; }; //将以上的结构体改成一个类类型: class Student { string name; int num; char sex; int age; }; //声明一个学生的类类型和声明一个学生的结构体类型很像很像,表面上看就差了一个关键字:struct 和 class,另外,C++中对结构体在基于C语言中的重要扩充就是可以添加函数了,类class也是一样,如下: class Student { string name; int num; char sex; int age; void print_name() { cout << "name = " << name << endl; } }; //以上class类中name, num, sex, age等如此的,叫做【属性】或者【成员变量】,而像print_name这个函数的,叫做【行为或者方法】或者【成员函数】
-
成员访问限定符:跟在谁后面的,就是哪种访问权限!
-
public(公有):
该限定符下的成员(遇到其他限定符,则在遇到处终止),既可以被本类中的成员函数引用,也可以被类的作用域的其他函数所引用,即从类的外部是可以调用的;
-
private(私有):
该限定符下的成员(遇到其他限定符,则在遇到处终止),只能被本类的成员函数所引用,类外部不能调用(友元类可以);
-
protected(保护):
该限定符下的成员(遇到其他限定符,则在遇到处终止),不能被类外访问,但是可以被派生类的成员函数访问。
-
-
如何决定成员变量与成员函数的访问权限:
-
一个类的成员不能全部为private,否则便失去定义该类的意义,成为了一个“闭关锁国”的类,所以需要提供接口函数;
-
也可以把一些成员设置为私有的,但是不对外提供修改的接口,因为可能这个属性或者成员变量对于类对象来说可能不想被外面知道或者修改;
-
将成员函数声明为私有的,这说明这个私有的成员函数只能被该类的其他成员函数所调用,是作为辅助的接口函数的,是在类的内部使用,不对外公开。
class Student { public: string name; int num; int age; private: char sex; int max_num(int x, int y) { return x > y ? x : y; } public: int get_max_num(int a, int b, int c) { int max_ab = max_num(a, b); return max_ab > c ? max_ab : c; } void print_name() { cout << "name = " << name << endl; } };
-
-
struct和class关键字的区别:
-
在C++中已经对struct进行了扩充,不仅可以声明成员变量,还可以声明成员函数,class关键字本身就是从struct发展而来的,所以struct支持的,class都支持。
-
最重要的一个区别就是:class默认的成员访问限定符是private,struct默认的成员访问限定符是public,所以,以下的操作:Student做结构体没问题,但作不对成员修饰的类是有问题的:
Student zhangsan = {"张三", 1001, 'm', 25}; zhangsan.num = 29; int num = zhangsan.num;
当使用class定义的对象时,是没有办法直接给一个私有变量赋值的:zhangshan.num = 21;
-
-
练习:
#include<iostream> using namespace std; class Student { private: string name; string num; int age; bool sex; public: void set_nna() { cin >> name >> num >> age >>sex; } void print_msg() { cout << "The information of student:\n\tName: " << name <<"\n\tNo.: "<<num<<"\n\tAge: "<<age<<"\n\tSex: "<<sex<<endl; } }; int main() { Student Thmos ; Thmos.set_nna(); Thmos.print_msg(); return 0; }