本文转载自:VC驿站
https://www.cctry.com/thread-289496-1-1.html
1、什么是类类型?
上节课给大家讲解了什么是面向对象的编程,即,可以把世间万物都看成是对象。既然是对象,那么就应该有对象的类型,也就是说可以把把世间万物抽象成类型,给归类对吧?
在C++中对象的类型称为类(class),用来表示一类具有共同属性和行为的类型。例如:人类,狗类,动物类,哺乳动物类等等。在C++中一般是先声明一个类类型,然后用这个类类型去定义多个对象,所以,对象就是类类型的一个实例,或者说是类类型的一个实例化的变量。
类类型是抽象出来的,所以类类型跟C++中的其他类型一样,不占用内存空间,而对象就是类类型的实例,是真正的变量,所以是占用存储空间的。
2、类类型的声明:
C++中声明一个类类型跟声明一个结构体类型很像。例如,咱们之前讲解的声明一个结构体的类型如下:
struct Student
{
string name;
int num;
char sex;
int age;
};
一个学生的结构体类型Student,包含学生的一些属性,如:姓名、学好、性别、年龄。基于这个结构体类型我们改一下,改成生成一个类类型:
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 之类的按照咱们上节课的只是可以叫做属性,print_name 这个函数呢,可以叫做行为或者方法。
这里面交给大家一些更通用的叫法:name,num,sex 之类的又可以叫做成员变量,print_name 可以叫做成员函数。
//////////////////////////////////////////////////////////////
那么我们接下来按照之前使用结构体类型对象的方式来使用一下类对象呢?看看好不好用,会不会有什么问题?我们来写几句代码:
Student zhangsan = {"张三", 1001, 'm', 25};
zhangsan.num = 29;
int num = zhangsan.num;
编译一下,看看结果?问题详情还请观看视频教程!
3、成员访问限定符:
C++针对类的成员,设定了三种方式的访问限定符:public、private、protected(用的不多)
public:意为共有的,公开的,公用的 成员,既可以被本类中的成员函数引用,也可以被类的作用域的其他函数所引用,即从类的外部是可以调用的;
例如,我家的房子就好比是一个类,如果来客人了,那么我可能招呼客人到客厅,这个客厅就是public类型的成员,外部可以访问,客人也可以到客厅中喝水,看电视等等;
private:意为私有的,私生的 成员,只能被本类的成员函数所引用,类外部不能调用(友元类可以,这个以后说明),
例如,我家的房子就好比是一个类,卧室就是private类型的成员,是一个相对隐私的地方。如果来客人了,我不希望客人访问我的卧室,除非经过我的允许(让成员函数去访问);
protected:意为受保护的成员,不能被类外访问,这点类似private,但是可以被派生类的成员函数访问,有关派生类的说明,以后会讲解。
附:在 class 中,public、private、protected 可以出现多次,也没有先后顺序之分,例如:
class Student
{
public:
string name;
int num;
int age;
private:
char sex;
public:
void print_name()
{
cout << "name = " << name << endl;
}
};
跟在谁后面的,就是哪种访问权限!
4、如何决定成员变量及成员函数的访问权限:
一般情况下,如果不希望外界访问本类的成员变量,那么就可以把成员变量都声明为私有的。但是有个前提必须提供可以访问的接口函数,不然一个类的所有成员都是private私有的话就没有意义了,相当于闭关锁国一样,不跟任何外界打交道,这点肯定不行。比如在Student这个类中,如果把sex性别这个成员变量设置为私有的,那么Student类就应该提供可以修改或者读取sex成员变量的成员函数,并且这个函数是public的,不然外界想要知道sex变量的值就没办法获取了。大家说是不是?
当然,也可以把一些成员设置为私有的,但是不对外提供修改的接口,因为可能这个属性或者成员变量对于类对象来说可能不想被外面知道或者修改,比如,这个学生是否脚臭,这个属性对别人有意义吗?鞋一穿上之后谁也不知道你脚臭不臭,只有自己知道,而且自己知道就够了。外界不需要知道。我也没熏到你,对不对?我也没在公共场合拖鞋,对不对?
还有一种情况就是将成员函数声明为私有的,这说明这个私有的成员函数只能被该类的其他成员函数所调用,是作为辅助的接口函数的,是在类的内部使用,不对外公开。例如:
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;
}
};
max_num 成员函数就是private私有的,是辅助或者配合public的get_max_num函数来实现功能的,我只想让外界知道或者我只提供求三个int整形的数中较大的,我不想提供求两个int整形的数中较大的。明白了吗?
5、struct 和 class 关键字的区别:
上面已经说过了,在C++中已经对struct进行了扩充,不仅可以声明成员变量,还可以声明成员函数,class关键字本身就是从struct发展而来的,所以struct支持的,class都支持。那么在C++中他们有什么异同呢?
最重要的一个区别就是:class默认的成员访问限定符是private,struct默认的成员访问限定符是public,所以,在之前的课程中struct定义的对象我们可以这样用:
Student zhangsan = {"张三", 1001, 'm', 25};
zhangsan.num = 29;
int num = zhangsan.num;
但是用class定义的对象就不行。因为你没办法直接这样给一个私有的成员变量赋值:zhangsan.num = 29;
6、小作业:
自己定义一个学生类,将该类的所有成员变量都声明为私有的,并添加一个共有的成员函数,实现从键盘录入该类对象的学生信息。
第30课视频教程下载地址:
https://www.cctry.com/thread-289496-1-1.html