VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

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

《实用C++》第33课 类的构造函数

  [复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-4-19 01:30:23 | 显示全部楼层 |阅读模式
1、对象的初始化:
之前给大家讲解过变量的初始化,例如:
  1. int a = 0;
复制代码

那么类的对象呢?本身类是自从结构体发展过来的,所以之前结构体的初始化操作,类都支持,例如:
  1. class Student
  2. {
  3. public:
  4.     char name[50];
  5.     int num;
  6.     int age;

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

  1. Student stud1 = {"zhangsan", 101, 15};
复制代码


可以这样在定义的时候直接初始化,也可以先定义后初始化,例如:
  1. Student stud2;
  2. strcpy(stud2.name, "lisi");
  3. stud2.num = 102;
  4. stud2.age = 20;
复制代码

或者说我想在对象定义完了之后马上将其初始化一下,这个初始化可以说是给类的成员都赋上一些初值,但不是具体的值,不想让变量默认都是一些杂乱无章的没有什么规律的未初始化状态的数,例如:
《实用C++》第33课 类的构造函数

我们可以这样做:
  1. Student stud3;
  2. stud3.age = 0;
  3. stud3.num = 0;
  4. memset(stud3.name, 0, 50);
复制代码

这样做是完全可以的,但是我问你,这是你定义的一个对象,那么如果你定义了100个学生的对象呢?重复的代码你可能要写100次,用循环来做吗?非常麻烦,而且,你这种初始化的方式只能初始化public类型的成员,private类型的你是初始化不了的,有的会员可能会说,我自己封装一个函数,定义完对象之后调用下就可以了,例如:
  1. class Student
  2. {
  3. public:
  4.     char name[50];
  5.     int num;
  6. private:
  7.     int age;

  8. public:
  9.     void init()
  10.     {
  11.         memset(name, 0, 50);
  12.         num = 100;
  13.         age = 10;
  14.     };
  15.     void set_age(int age)
  16.     {
  17.         this->age = age;
  18.     };
  19. };

  20. Student stud3;
  21. stud3.init();
复制代码


这样做也是可以的,但是如果对象很多的话,也得循环调用 init 函数,如果这样定义个对象数组:
  1. Student stud_array[1000];
复制代码

那么你怎么为数组中的每个对象都调用 init 函数初始化呢?用个 for 循环?麻不麻烦啊?有什么更好的解决办法吗?C++的作者早就想到了。。。构造函数!

2、什么是构造函数?
构造函数就是解决上面的问题而存在的。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来主动调用它,构造函数会在对象被建立时自动被调用的。作用就是用来处理对象的初始化操作。

3、构造函数的注意事项:
①、构造函数的名字必须与类名同名,不能随意命名,这样的话才能让编译器认为该函数是构造函数,而不是类的普通成员函数;
②、构造函数不具有任何类型,不返回任何值,连 void 都不是;
③、构造函数不需要用户调用,也不应该被用户调用,它是对象建立的时候自动被系统调用,用来初始化刚刚建立的对象的;
④、如果用户没有定义自己的类的构造函数,那么系统会自动生成一个默认的构造函数,只不过该构造函数的函数体是空的,也就是什么都不做。

4、为 Student 类实现构造函数:
  1. class Student
  2. {
  3. public:
  4.     char name[50];
  5.     int num;
  6. private:
  7.     int age;

  8. public:
  9.     Student()
  10.     {
  11.         memset(name, 0, 50);
  12.         num = 100;
  13.         age = 10;
  14.         cout << "Student 构造函数被调用!" << endl;
  15.     };

  16.     void set_age(int age)
  17.     {
  18.         this->age = age;
  19.     };
  20. };
复制代码


接下来,我们来实例化一个类对象试试,具体演示见视频教程!

5、带参数的构造函数:
既然构造函数也是函数,那么这个构造函数是否可以带参数呢?答案是肯定的。
例如,Student 类不仅提供了默认的不带参数的构造函数,可以允许用户在定义类对象的时候自动调用,那么是否也可以提供一个带参数的构造函数,可以允许用户在定义类对象的时候就利用构造函数的参数来初始化对象的成员呢?我们来给大家演示下:
  1. class Student
  2. {
  3. public:
  4.     char name[50];
  5.     int num;
  6. private:
  7.     int age;

  8. public:
  9.     Student()
  10.     {
  11.         memset(name, 0, 50);
  12.         num = 100;
  13.         age = 10;
  14.         cout << "Student 构造函数1被调用!" << endl;
  15.     };

  16.     Student(int stud_num)
  17.     {
  18.         memset(name, 0, 50);
  19.         num = stud_num;
  20.         age = 10;
  21.         cout << "Student 构造函数2被调用!" << endl;
  22.     };

  23.     Student(int stud_num, int stud_age)
  24.     {
  25.         memset(name, 0, 50);
  26.         num = stud_num;
  27.         age = stud_age;
  28.         cout << "Student 构造函数3被调用!" << endl;
  29.     };

  30.     void set_age(int age)
  31.     {
  32.         this->age = age;
  33.     };
  34. };

  35. int _tmain(int argc, _TCHAR* argv[])
  36. {
  37.     Student stud1;
  38.     Student stud2(100);
  39.     Student stud3(101, 15);
  40.     return 0;
  41. }
复制代码


6、小作业:
有这么个需求,所有的在校生都必须有学号,所以能不能实现实例化一个Student对象之后,就要求输入学号,不存在一个没有学号的Student对象被实例化出来,大家明白了吗?也就是类似于 stud1 这样的对象是不允许存在的,因为其没有学号。大家课后试着做一下!

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

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

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




上一篇:《实用C++》第32课 this指针
下一篇:第27课 new结构体类型出错了

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

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

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

69_avatar_middle
在线会员 awfymwvf 发表于 2018-4-19 08:04:36 | 显示全部楼层
第一个来支持SYC大神

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

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

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

回复 支持 反对

使用道具 举报

78_avatar_middle
在线会员 csa 发表于 2018-4-19 09:12:35 | 显示全部楼层
又出新课程,谢谢分享

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

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

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

回复 支持 反对

使用道具 举报

89_avatar_middle
在线会员 yyanjun 发表于 2018-4-20 20:17:02 | 显示全部楼层
构造类,谢谢分享

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

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

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

回复 支持 反对

使用道具 举报

98_avatar_middle
在线会员 tomok 发表于 2018-4-21 09:13:13 | 显示全部楼层
谢谢提供
继续学习

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

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

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

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-4-21 09:45:07 | 显示全部楼层
看看                  

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

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

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

回复 支持 反对

使用道具 举报

84_avatar_middle
在线会员 glgh 发表于 2018-4-21 16:21:58 | 显示全部楼层
感谢分享。

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

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

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

回复 支持 反对

使用道具 举报

82_avatar_middle
在线会员 DetectiveY 发表于 2018-4-22 10:53:30 | 显示全部楼层
感谢分享。

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

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

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

回复 支持 反对

使用道具 举报

80_avatar_middle
在线会员 zp521 发表于 2018-4-23 09:07:43 | 显示全部楼层
坚持学习!

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

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

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

回复 支持 反对

使用道具 举报

43_avatar_middle
online_vip Conanmilk 发表于 2018-4-23 10:21:34 | 显示全部楼层
打卡打卡,学习学习

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

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

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

回复 支持 反对

使用道具 举报

08_avatar_middle
在线会员 guanghua1982 发表于 2018-4-23 23:17:35 | 显示全部楼层
老师更新了新课程!

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

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

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

回复 支持 反对

使用道具 举报

55_avatar_middle
在线会员 Smallbee 发表于 2018-4-24 16:03:10 | 显示全部楼层
类的构造函数《实用C++》第33课 类的构造函数

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

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

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

回复 支持 反对

使用道具 举报

94_avatar_middle
online_vip08 Mtong 发表于 2018-4-25 12:39:34 | 显示全部楼层
构造函数不具有任何类型,不返回任何值,连 void 都不是;

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

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

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

回复 支持 反对

使用道具 举报

05_avatar_middle
在线会员 625136403 发表于 2018-4-26 20:04:00 | 显示全部楼层
好好学习好好学习好好学习

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

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

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

回复 支持 反对

使用道具 举报

82_avatar_middle
在线会员 ha521ha 发表于 2018-4-29 09:19:49 | 显示全部楼层
一直很想学习C++

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

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

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

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 hbjdt 发表于 2018-5-3 09:33:31 | 显示全部楼层
坚持学习!!!!

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

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

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

回复 支持 反对

使用道具 举报

44_avatar_middle
在线会员 a281288098 发表于 2018-5-3 15:13:07 | 显示全部楼层
多谢楼主用心录制教程。

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

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

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

回复 支持 反对

使用道具 举报

22_avatar_middle
online_vip jesy 发表于 2018-5-4 23:19:52 | 显示全部楼层
来学习啊《实用C++》第33课 类的构造函数

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

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

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

回复 支持 反对

使用道具 举报

95_avatar_middle
在线会员 zjh2008 发表于 2018-5-6 10:36:48 | 显示全部楼层
又出新课程,谢谢分享

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

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

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

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 Sam599 发表于 2018-5-6 10:52:10 | 显示全部楼层
感谢楼主分享!

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

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

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

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

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

GMT+8, 2018-9-24 20:17

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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