VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 2035|回复: 64

《实用C++》第30课 类的声明

  [复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-27 15:42:50 | 显示全部楼层 |阅读模式
1、什么是类类型?
上节课给大家讲解了什么是面向对象的编程,即,可以把世间万物都看成是对象。既然是对象,那么就应该有对象的类型,也就是说可以把把世间万物抽象成类型,给归类对吧?
在C++中对象的类型称为类(class),用来表示一类具有共同属性和行为的类型。例如:人类,狗类,动物类,哺乳动物类等等。在C++中一般是先声明一个类类型,然后用这个类类型去定义多个对象,所以,对象就是类类型的一个实例,或者说是类类型的一个实例化的变量。

类类型是抽象出来的,所以类类型跟C++中的其他类型一样,不占用内存空间,而对象就是类类型的实例,是真正的变量,所以是占用存储空间的。

2、类类型的声明:
C++中声明一个类类型跟声明一个结构体类型很像。例如,咱们之前讲解的声明一个结构体的类型如下:
  1. struct Student
  2. {
  3.     string name;
  4.     int num;
  5.     char sex;
  6.     int age;
  7. };
复制代码

一个学生的结构体类型Student,包含学生的一些属性,如:姓名、学好、性别、年龄。基于这个结构体类型我们改一下,改成生成一个类类型:
  1. class Student
  2. {
  3.     string name;
  4.     int num;
  5.     char sex;
  6.     int age;
  7. };
复制代码


大家看到了吗?声明一个学生的类类型和声明一个学生的结构体类型很像很像,表面上看就差了一个关键字:struct 和 class,另外,C++中对结构体在基于C语言中的重要扩充就是可以添加函数了,类class也是一样,例如:
  1. class Student
  2. {
  3.     string name;
  4.     int num;
  5.     char sex;
  6.     int age;

  7.     void print_name()
  8.     {
  9.         cout << "name = " << name << endl;
  10.     }
  11. };
复制代码


//////////////////////////////////////////////////////////////
备注:这里面在给大家说说有关属性和方法的名字的问题。
class类中的name,num,sex 之类的按照咱们上节课的只是可以叫做属性,print_name 这个函数呢,可以叫做行为或者方法
这里面交给大家一些更通用的叫法:name,num,sex 之类的又可以叫做成员变量,print_name 可以叫做成员函数
//////////////////////////////////////////////////////////////


那么我们接下来按照之前使用结构体类型对象的方式来使用一下类对象呢?看看好不好用,会不会有什么问题?我们来写几句代码:
  1. Student zhangsan = {"张三", 1001, 'm', 25};
  2. zhangsan.num = 29;
  3. int num = zhangsan.num;
复制代码


编译一下,看看结果?问题详情还请观看视频教程!

3、成员访问限定符:
C++针对类的成员,设定了三种方式的访问限定符:public、private、protected(用的不多)
public:意为共有的,公开的,公用的 成员,既可以被本类中的成员函数引用,也可以被类的作用域的其他函数所引用,即从类的外部是可以调用的;
例如,我家的房子就好比是一个类,如果来客人了,那么我可能招呼客人到客厅,这个客厅就是public类型的成员,外部可以访问,客人也可以到客厅中喝水,看电视等等;

private:意为私有的,私生的 成员,只能被本类的成员函数所引用,类外部不能调用(友元类可以,这个以后说明),
例如,我家的房子就好比是一个类,卧室就是private类型的成员,是一个相对隐私的地方。如果来客人了,我不希望客人访问我的卧室,除非经过我的允许(让成员函数去访问);

protected:意为受保护的成员,不能被类外访问,这点类似private,但是可以被派生类的成员函数访问,有关派生类的说明,以后会讲解。

附:在 class 中,public、private、protected 可以出现多次,也没有先后顺序之分,例如:
  1. class Student
  2. {
  3. public:
  4.     string name;
  5.     int num;
  6.     int age;

  7. private:
  8.     char sex;

  9. public:
  10.     void print_name()
  11.     {
  12.         cout << "name = " << name << endl;
  13.     }
  14. };
复制代码


跟在谁后面的,就是哪种访问权限!

4、如何决定成员变量及成员函数的访问权限:
一般情况下,如果不希望外界访问本类的成员变量,那么就可以把成员变量都声明为私有的。但是有个前提必须提供可以访问的接口函数,不然一个类的所有成员都是private私有的话就没有意义了,相当于闭关锁国一样,不跟任何外界打交道,这点肯定不行。比如在Student这个类中,如果把sex性别这个成员变量设置为私有的,那么Student类就应该提供可以修改或者读取sex成员变量的成员函数,并且这个函数是public的,不然外界想要知道sex变量的值就没办法获取了。大家说是不是?

当然,也可以把一些成员设置为私有的,但是不对外提供修改的接口,因为可能这个属性或者成员变量对于类对象来说可能不想被外面知道或者修改,比如,这个学生是否脚臭,这个属性对别人有意义吗?鞋一穿上之后谁也不知道你脚臭不臭,只有自己知道,而且自己知道就够了。外界不需要知道。我也没熏到你,对不对?我也没在公共场合拖鞋,对不对?

还有一种情况就是将成员函数声明为私有的,这说明这个私有的成员函数只能被该类的其他成员函数所调用,是作为辅助的接口函数的,是在类的内部使用,不对外公开。例如:
  1. class Student
  2. {
  3. public:
  4.     string name;
  5.     int num;
  6.     int age;

  7. private:
  8.     char sex;
  9.     int max_num(int x, int y)
  10.     {
  11.         return x > y ? x : y;
  12.     }

  13. public:
  14.     int get_max_num(int a, int b, int c)
  15.     {
  16.         int max_ab = max_num(a, b);
  17.         return max_ab > c ? max_ab : c;
  18.     }

  19.     void print_name()
  20.     {
  21.         cout << "name = " << name << endl;
  22.     }
  23. };
复制代码


max_num 成员函数就是private私有的,是辅助或者配合public的get_max_num函数来实现功能的,我只想让外界知道或者我只提供求三个int整形的数中较大的,我不想提供求两个int整形的数中较大的。明白了吗?

5、struct 和 class 关键字的区别:
上面已经说过了,在C++中已经对struct进行了扩充,不仅可以声明成员变量,还可以声明成员函数,class关键字本身就是从struct发展而来的,所以struct支持的,class都支持。那么在C++中他们有什么异同呢?
最重要的一个区别就是:class默认的成员访问限定符是private,struct默认的成员访问限定符是public,所以,在之前的课程中struct定义的对象我们可以这样用:
  1. Student zhangsan = {"张三", 1001, 'm', 25};
  2. zhangsan.num = 29;
  3. int num = zhangsan.num;
复制代码


但是用class定义的对象就不行。因为你没办法直接这样给一个私有的成员变量赋值:zhangsan.num = 29;

6、小作业:
自己定义一个学生类,将该类的所有成员变量都声明为私有的,并添加一个共有的成员函数,实现从键盘录入该类对象的学生信息。

第30课免费试看,下载地址回复后可见!
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:http://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################




上一篇:《实用C++》第29课 面向对象的程序设计
下一篇:Windows编程(一)helloworld

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

15_avatar_middle
online_member 矿泉水 发表于 2018-3-27 21:58:47 | 显示全部楼层
沙发????

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
online_member tomok 发表于 2018-3-28 09:02:37 | 显示全部楼层
学习



发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

78_avatar_middle
online_member csa 发表于 2018-3-28 10:30:17 | 显示全部楼层
这个不错,谢谢。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
online_member zp521 发表于 2018-3-30 08:42:10 | 显示全部楼层
坚持学习!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
online_member awfymwvf 发表于 2018-3-30 08:47:58 | 显示全部楼层
支持SYC大神,我要好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

47_avatar_middle
online_member hcy34961 发表于 2018-3-30 15:12:10 | 显示全部楼层
坚持学习!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-3-31 09:29:20 | 显示全部楼层
看看                 

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

66_avatar_middle
online_member ly1599285982 发表于 2018-3-31 14:27:42 | 显示全部楼层
struct 和 class 关键字的区别:

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

18_avatar_middle
online_vip 听雨声等你笑 发表于 2018-3-31 21:54:12 | 显示全部楼层
学习学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member DetectiveY 发表于 2018-4-1 10:40:32 | 显示全部楼层
谢谢大佬   

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

84_avatar_middle
online_member glgh 发表于 2018-4-1 15:56:19 | 显示全部楼层
感谢分享。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
online_member qq123180056 发表于 2018-4-2 21:30:58 | 显示全部楼层
感谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

05_avatar_middle
online_member 625136403 发表于 2018-4-2 22:11:02 | 显示全部楼层
好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

95_avatar_middle
online_vip labc123 发表于 2018-4-3 11:01:52 | 显示全部楼层

感谢分享,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

61_avatar_middle
online_member qq335647559 发表于 2018-4-5 14:56:41 | 显示全部楼层
感谢楼主分享,新手学习了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
online_vip jesy 发表于 2018-4-5 17:49:02 | 显示全部楼层
坚持学习!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
online_vip luo19730210 发表于 2018-4-5 18:34:28 | 显示全部楼层
学习一下,好进度

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

95_avatar_middle
online_member zjh2008 发表于 2018-4-6 22:14:14 | 显示全部楼层
这个不错,谢谢。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member ha521ha 发表于 2018-4-7 15:30:03 | 显示全部楼层
想学习C++

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-7-17 06:02

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表