接上文...

16.3类的成员

2.成员函数

1、构造函数

...

2、拷贝构造函数

有了类的构造函数我们就可以创建类的实例了,下图中分别使用不同的构造函数一共创建了4个动物的对象,现在程序中就有4个活蹦乱跳的小动物了。

假如如果你特别喜欢而想有一个和seven一模一样的小动物可以吗?下图中的一行代码可以帮你做到。

上图第91行smallAni04_copy就是一个新创建的动物,它与叫做seven的动物完全相同。那么创建这个新动物对象使用了哪个构造函数呢?这一次的创建并没有使用前面写的构造函数,而是使用到一个系统为Animal类添加的函数:拷贝构造函数,或称为复制构造函数。在我们没写的情况下系统会为这个类自动添加这个函数,但我们自己也可以在Animal类中写这个函数。

首先要在类中声明这个拷贝构造函数,你会注意到这个函数的参数有些特点:参数的类型是Animal类型,说明参数是一个动物类的对象,参数类型后面的&表示传递的参数是一个引用,const表明这个参数是一个常量,函数体中不能修改参数。

3、属性函数

前面我们定义在类中的数据成员——属性,描述了这个类的所有对象共同的特征,而给属性一个值却是发生在构造函数创建实例对象时。由于类的属性访问权限被私有了(private:),类的外部是没有任何办法直接访问属性数据的。程序运行中一些类的对象常常有必要与这个类的对象交换数据,那就需要这个类来提供一些属性访问的“官方通道”,允许类的部分属性能被外部对象访问。

类要提供属性访问通道,就需要定义一些“属性函数”。

上图中类声明了读取这个类的name、color和height属性的get..()函数,其中color和height属性还可以通过set..(...)函数来修改这个属性的数值。属性函数的实现如下图所示:

属性函数提供了外界与类进行数据通信的接口,类的哪些属性的值可以被读取,哪些属性的值可以被修改,取决于类的设计者。

另外,如果类中的函数(比如属性函数)只是用来读取属性的数据而没有修改属性的值,就像上面的get...()函数,那么可以把这个函数声明为const函数。

如果函数被const标记后,编译器会检查函数体中是否有修改类的属性的代码,c++编程标准推荐将类中的函数尽可能的声明为const。

4、析构函数

在程序中每次通过类的构造函数创建一个类对象都要消耗一定的内存,消耗的大小取决于类中数据成员的数量和类型。当程序中不再需要一个对象时,可以把这个对象从内存中清除掉,这个工作可以由写在类中的析构函数完成。在定义一个类时,开发者可以在类中声明一个析构函数。

析构函数的调用是由系统完成的,开发者无需自己编写调用代码。如果类中没有写析构函数,系统在编译类时会自动添加一个。

5、功能函数

上面介绍的几种类函数,在类中有特定的作用,实现了类的一些基本功能。开发者在程序中定义一个类的更重要的目的是让这个类的对象在程序逻辑中能够完成一些特殊的使命,比如一个学生类的对象可以写作业、吃饭、做游戏,一个笔记本电脑类的对象可以播放音乐、视频、运行程序等等。

我们把写在类里,让类对象可以执行的、有趣的功能称为类的功能函数,比如可以在这个动物类中定义让动物吃饭、玩耍、学习、洗澡的函数。

abstract类中不可以有private的成员_C++ 类:声明成员函数与实现相关推荐

  1. 先设计一个基本账户类,再通过继承基本账户类设计一个储蓄账户类,储蓄账户类中增加一个静态成员变量(年利率),并增加如下成员函数:(1)计算月利息月利息=存款金额x年利率+12(2)更改利率(静态方法)

    实验二:继承和派生程序设计(4学时)必做题: 先设计一个基本账户类,再通过继承基本账户类设计一个储蓄账户类,储蓄账户类中增加一个静态成员变量(年利率),并增加如下成员函数:(1)计算月利息 月利息=存 ...

  2. java一个项目只有一个主类吗_组成Java Application的若干类中,有且仅有一个主类,只有主类中含有主方main()。...

    组成Java Application的若干类中,有且仅有一个主类,只有主类中含有主方main(). A:对 B:错 正确答案:对 解析: 组成Java Application的若干类中,有且仅有一个主 ...

  3. Idea一键自动导包设置--导入类中所有包?教你自动更新类中包含的包

    在日常的拷贝复用代码中,导包的重复性工作非常繁琐,在这里分享一个idea设置. 动态效果演示: Idea一键自动导包设置--导入类中所有包?教你自动更新类中包含的包 操作步骤: File-->S ...

  4. abstract类中不可以有private的成员_别再说你不懂java面向对象了,阿里P7大佬一次性给你讲的明明白白

    前言 面向对象在百度百科中是这样解释的:"面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物".说的好像很流弊的样子,看看就行. 包的认识 1.1:包 ...

  5. abstract类中不可以有private的成员_C++类成员的三种访问权限:public/protected/private...

    1.访问限定符 C++ 通过 public.protected.private 三个关键字来控制成员变量和成员函数的访问权限(也称为可见性),分别表示:公有的.受保护的.私有的. class 2.访问 ...

  6. abstract类中不可以有private的成员_C++中public、protected、private的区别

    1.访问范围 private:只能由该类的成员函数.友元的成员函数访问,不能被其他类的成员函数访问,即使是该类的对象也不能直接访问 protected:可以被该类中的成员函数访问.子类中的成员函数访问 ...

  7. abstract类中不可以有private的成员_UML类图还不懂?来看看这版乡村爱情类图,一把学会!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.码场心得 有个词叫内卷严重! 最开始听到这个词是有个小伙伴在我的一篇HashMap源码分析 ...

  8. java枚举类中字段有没有必要加final____枚举类字段 Field ‘xxx‘ may be ‘final‘

    java枚举类中字段有没有必要加final 今天在写一个系统统一返回码的枚举类时候,突然想到一个问题,当不小心手抖给枚举类自动生成了set方法,而恰巧在用的地方不小心用了set方法,从而修改了code ...

  9. C++在一个类中定义另一个有参数构造函数的类的对象

    class A { public:     A( int i ){} }; class B { public:     B():a(1){}    //或:B( int i ):a( i ){ }.对 ...

最新文章

  1. 使用NLog实现一个简单的日志记录(包含源代码)
  2. Unity 字典实现
  3. Vue导入非模块化的第三方插件功能无效解决方案
  4. 微软职位内部推荐-Senior SW Engineer for Application Ecosystem
  5. set trans 必须是事务处理的第一个语句_MySQL中特别实用的几种SQL语句送给大家
  6. linux update语句,关于Update语句的调整(5-1)
  7. 利用css transition属性实现一个带动画显隐的微信小程序部件
  8. k8s的ingress使用
  9. VS2012打开项目 提示Asp.net4.0未在web服务器上注册的解决方案
  10. python---之os.path.splitext(“文件路径”)
  11. Stata统计学软件
  12. 【面试招聘】我的秋招记录——(自然语言处理-面经+感悟)
  13. 学习笔记——物联网知识
  14. 奇葩需求系列-距离明天十二点倒计时
  15. 【微信小程序】点击事件绑定三元方法
  16. 淘宝新版打标足迹在哪里浏览?
  17. 【刷题】求长方形与正方形的个数
  18. html5研究背景及意义,基于HTML5的统计图表系统的研究与设计
  19. 史玉柱和郭广昌谈创业团队管理:两种类型的“孔雀王”
  20. 【北邮国院大三上】电子商务法(e-commerce law)知识点整理——Banking Lawe-Payment

热门文章

  1. 学习Enroll例程
  2. 今天,一个收到谷歌Offer的学弟用50W年薪秀了我一脸...
  3. telnet后为啥打开的时防火墙_《和平精英》停服时玩家打开国际服,淘汰1个敌人后收到1个提示!...
  4. Apriori关联规则算法实现及其原理(基础篇)
  5. 这个处理不同基因组区域关系的工具集很不错!
  6. 来看看这些门户网站的变迁史 - 感受下网络发展的这段过往
  7. 诺奖技术和高通量筛选双双找到新冠病毒的脉门
  8. 这份精子保存了1亿年,不仅长度惊人还刷新了一项记录
  9. 高通量数据中批次效应的鉴定和处理(二)
  10. Airflow使用入门指南