• 如果一个类将自己的成员变量声明为protected,则该类很有可能作为多态基类

    一个类的成员变量一般不声明为public(如果非声明为public不可的话,使用struct岂不是更好),而protectedprivate的区别正在于所修饰的变量是否子类可见。

  • 一个类的析构函数如果为virtual的话,则该类很多可能作为多态基类,则该类应有另外的virtual成员函数

实现一个类的顺序

  • 所有封装的成员变量
  • 围绕成员变量的构造函数
  • 成员变量的存取
  • 其他成员变量

私有成员函数

有些类内部会有一些私有的函数,除了友元之外,
这些私有的函数只开放给类自身,也即仅会被类内部其他成员函数所调用,属于劳模,属于干脏活累活的人,属于幕后的工作人员,也即幕后英雄;

所以结论是什么,私有成员函数仅被类内其他成员函数所调用,设计与实现的顺序是,先设计私有,后设计公有。是先设计与实现私有成员函数,再实现需要依赖该私有成员函数的共有成员函数;

构成重载 vs 不构成重载?

DAttrInfo& cast_to_d();
const DAttrInfo& cast_to_d() const;DAttrInfo& cast_to_d();
DAttrInfo& cast_to_d() const;// 以上均可构成重载
DAttrInfo& cast_to_d();
const DAttrInfo& cast_to_d();// 无法重载仅按返回类型区分的函数

默认构造和默认析构

类的默认构造函数会调用其全部成员变量(不包括内置类型)的默认构造函数(如果存在的话),同理类的默认析构函数会调用其全部成员变量的默认析构函数(如果存在的话)。

class Widget
{
public:Widget() { cout << "Widget::Widget()" << endl;}~Widget() { cout << "Widget::~Widget()" << endl;}
};class Test
{
private:int x;Widget w;
public:int get() const { return x;}
};int main(int, char**)
{Test t;cout << t.get() << endl;return 0;
}

为多态基类声明virtual析构函数

enum TimerType
{Atomic,Water,Writst
};
class TimeKeeper
{
public:/*virtual*/ ~TimeKeeper() { cout << "TimeKeeper::~TimeKeeper()" << endl;}
};class AtomicClock :public TimeKeeper
{
public:~AtomicClock() { cout << "AtomicClock::~AtomicClock()" << endl;}
};TimeKeeper* getTimeKeeper(TimeKeeperType type)
{TimeKeeper* tk;switch(type){case Atomic:tk = new AtomicClock;break;case Water:tk = new WaterClock;break;case Wrist:tk = new WristWatch;break;default:tk = nullptr;break;}return tk;
}int main(int, char**)
{TimeKeeper* tk = getTimeKeeper(Atomic);delete tk;// TimerKeeper::TimerKeeper()// 如果析构函数不是virtual的,可见不会调用子类的析构函数// 如果将基类的析构函数声明为virtual,// 当derived class对象经由base class指针删除时,就会先调用基类的析构函数,再调用父类的析构函数return 0;
}

再次请深入理解,virtual函数(普通函数以及析构函数)的目的是允许derived class的实现得以客制化

面向对象——类设计(一)相关推荐

  1. 面向对象——类设计(五)

    面向对象--类设计(一) 面向对象--类设计(二) 面向对象--类设计(三) 面向对象--类设计(四) (1)约定:私有成员函数:以下划线开头,_:公有成员函数则不必: 设计顺序 类首先是对成员变量的 ...

  2. 面向对象——类设计(二)

    面向对象--类设计(一) 拷贝构造函数 拷贝构造函数(copy ctor)和拷贝赋值(copy assignment)操作符: 编译器创建的版本只是单纯地将来源对象的每一个non-static成员变量 ...

  3. 面向对象 —— 类设计(九) —— 类设计的内在一致性

    类设计的内在一致性,可以理解为"逻辑一致性".所谓逻辑一致性,比如说,网络上流传甚广的"俗话说,俗话又说"系列,"宰相肚里"vs " ...

  4. 面向对象——类设计(六)——算法类

    对于一个基于面向对象的数据聚类的基础类库(Class Library)而言,算法类(Algorithm,这里特指聚类算法 clustering algorithms)的设计是必不可少的一环. 聚类算法 ...

  5. 面向对象 —— 类设计(十二)—— 全局变量和成员变量

    全局变量和成员变量都提供了一种共享和通信机制: 只不过成员变量的共享和通信仅限于类内部,全局变量则是全局可见: 更为重要的是,类的访问修饰符概念为成员变量的访问和修改施加了更多的限制,也即在面向对象的 ...

  6. 面向对象 —— 类设计(八)

    私有成员与全局函数 根据信息局部化的原则,局部使用的功能(或者更浅薄的理解为只被当前类的其他成员函数调用的,被使用的场合单一)不应定义为全局函数. 成员变量与成员函数 (1)思考:成员变量是一个类得以 ...

  7. 面向对象 —— 类设计(十)—— 成员函数

    注意区别同名成员函数接口所属的类类型: BinNodePosi(T) BinNode<T>::insertAsLC(const T&); BinNodePosi(T) BinTre ...

  8. 面向对象——类设计(七)

    定义(definition)即类.类间关系 (1)A cluster is a collection of objects or records that share the same propert ...

  9. 面向对象 —— 类设计(十一)—— 构造与析构

    1. 构造函数 构造函数的形式参数:表达的是该对象成立的前提,也即依赖(对象成立依赖于那些其他对象) 构造函数的功能 完成成员变量的初始化工作: 构造函数的分类 默认构造 基于复制的构造

最新文章

  1. POSIX 串口编程指南
  2. 【转】掌握Azure订阅的关键概念和术语
  3. 漫谈新零售:疫情对新零售的十大影响
  4. 快速下载助手1.1--添加断点下载
  5. 【tensorflow】张量tensor--数据容器(把它想象成一个数字的水桶)
  6. Mr.J--jQuery效果总结
  7. Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
  8. Python3.x中数据随机重排基本方法
  9. 字节跳动高工面试:mysql查询重复数据sql
  10. 每天Leetcode 刷题 初级算法篇-打乱数组
  11. 【细节实现题】LeetCode 57. Insert Interval
  12. 有什么软件可用于Mac系统的硬盘格式转换
  13. 出师表 / 前出师表 作者:诸葛亮
  14. C#WINFORM控件之ComboBox
  15. R语言安装教程 | 图文介绍超详细
  16. C语言中终端一直有光标闪烁,word里光标一直闪
  17. [Luogu] 贪婪大陆
  18. Dremel made simple with Parquet (Parquet 原理分析)
  19. “二舅”火了,自媒体短视频“爆火”的基本要素,你知道吗?
  20. Ardunio开发实例-红外避障传感器

热门文章

  1. java动画api_使用MMAPI播放gif动画
  2. 三菱fx2n做从站的modbus通讯_三菱FX2N与昆仑通态(MCGS)无线编程口通讯例程
  3. C语言之测试程序运行时间
  4. bootstrap tab切换无效的一种情况
  5. Siki_Unity_2-9_C#高级教程(未完)
  6. Spring Boot实战笔记(一)-- Spring简介
  7. java.io.FileNotFoundException: ...\ibs\library-1.0.17.jar (系统找不到指定的文件。)
  8. CodeForces Round #290 Div.2
  9. [转]浅谈php web安全
  10. Spring Roo 之 Mysql 连接