面向对象——类设计(一)
如果一个类将自己的成员变量声明为
protected
,则该类很有可能作为多态基类一个类的成员变量一般不声明为
public
(如果非声明为public不可的话,使用struct岂不是更好),而protected
与private
的区别正在于所修饰的变量是否子类可见。一个类的析构函数如果为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)约定:私有成员函数:以下划线开头,_:公有成员函数则不必: 设计顺序 类首先是对成员变量的 ...
- 面向对象——类设计(二)
面向对象--类设计(一) 拷贝构造函数 拷贝构造函数(copy ctor)和拷贝赋值(copy assignment)操作符: 编译器创建的版本只是单纯地将来源对象的每一个non-static成员变量 ...
- 面向对象 —— 类设计(九) —— 类设计的内在一致性
类设计的内在一致性,可以理解为"逻辑一致性".所谓逻辑一致性,比如说,网络上流传甚广的"俗话说,俗话又说"系列,"宰相肚里"vs " ...
- 面向对象——类设计(六)——算法类
对于一个基于面向对象的数据聚类的基础类库(Class Library)而言,算法类(Algorithm,这里特指聚类算法 clustering algorithms)的设计是必不可少的一环. 聚类算法 ...
- 面向对象 —— 类设计(十二)—— 全局变量和成员变量
全局变量和成员变量都提供了一种共享和通信机制: 只不过成员变量的共享和通信仅限于类内部,全局变量则是全局可见: 更为重要的是,类的访问修饰符概念为成员变量的访问和修改施加了更多的限制,也即在面向对象的 ...
- 面向对象 —— 类设计(八)
私有成员与全局函数 根据信息局部化的原则,局部使用的功能(或者更浅薄的理解为只被当前类的其他成员函数调用的,被使用的场合单一)不应定义为全局函数. 成员变量与成员函数 (1)思考:成员变量是一个类得以 ...
- 面向对象 —— 类设计(十)—— 成员函数
注意区别同名成员函数接口所属的类类型: BinNodePosi(T) BinNode<T>::insertAsLC(const T&); BinNodePosi(T) BinTre ...
- 面向对象——类设计(七)
定义(definition)即类.类间关系 (1)A cluster is a collection of objects or records that share the same propert ...
- 面向对象 —— 类设计(十一)—— 构造与析构
1. 构造函数 构造函数的形式参数:表达的是该对象成立的前提,也即依赖(对象成立依赖于那些其他对象) 构造函数的功能 完成成员变量的初始化工作: 构造函数的分类 默认构造 基于复制的构造
最新文章
- POSIX 串口编程指南
- 【转】掌握Azure订阅的关键概念和术语
- 漫谈新零售:疫情对新零售的十大影响
- 快速下载助手1.1--添加断点下载
- 【tensorflow】张量tensor--数据容器(把它想象成一个数字的水桶)
- Mr.J--jQuery效果总结
- Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
- Python3.x中数据随机重排基本方法
- 字节跳动高工面试:mysql查询重复数据sql
- 每天Leetcode 刷题 初级算法篇-打乱数组
- 【细节实现题】LeetCode 57. Insert Interval
- 有什么软件可用于Mac系统的硬盘格式转换
- 出师表 / 前出师表 作者:诸葛亮
- C#WINFORM控件之ComboBox
- R语言安装教程 | 图文介绍超详细
- C语言中终端一直有光标闪烁,word里光标一直闪
- [Luogu] 贪婪大陆
- Dremel made simple with Parquet (Parquet 原理分析)
- “二舅”火了,自媒体短视频“爆火”的基本要素,你知道吗?
- Ardunio开发实例-红外避障传感器
热门文章
- java动画api_使用MMAPI播放gif动画
- 三菱fx2n做从站的modbus通讯_三菱FX2N与昆仑通态(MCGS)无线编程口通讯例程
- C语言之测试程序运行时间
- bootstrap tab切换无效的一种情况
- Siki_Unity_2-9_C#高级教程(未完)
- Spring Boot实战笔记(一)-- Spring简介
- java.io.FileNotFoundException: ...\ibs\library-1.0.17.jar (系统找不到指定的文件。)
- CodeForces Round #290 Div.2
- [转]浅谈php web安全
- Spring Roo 之 Mysql 连接