c++ 附赠课程的知识点记录

(1) 静态变量的赋值

再一个例子:

(2) 一般在定义类的赋值运算符函数时, operator = ( const A& a ) 函数,应避免自赋值的情况,就是把对象 a 又赋值给 对象a 如同 a = a 这样的情况。就是在 库代码中, STL 库大师们也要考虑这种情况。以 类 string 为例,函数体的逻辑就是什么也不做。处理函数返回值时直接把原对象返回即可:

( 3 ) 存在继承关系时,子类的 copy 构造函数与赋值运算符函数的书写。参考库代码 map 类的实现:

同时由上图可知, copy 构造函数与赋值运算符函数有功能相同的地方,可以如库代码般,把实现 copy 动作的代码封装为一个新的函数,并被 copy 构造函数和赋值运算符函数调用。

(4) is_a 关系 : 子类与父类应保持功能的一致性。若功能差异较大,则不应采用继承方式。 is_a 表示,使用父类的场合,也可以用子类替代。对于父类的非虚函数,子类不应该遮蔽。

( 5 ) 可以在类外为父类中的纯虚函数增加函数体:

这么做的目的是为了让子类有更多的选择,既可以直接使用父类中的纯虚函数体,也可以自定义。

(6) has_a : 一个类的数据成员是另一个类类型。这是组合关系。

is_implemented_in_terms_of : 基于某种已知类型来构建新的类,比如 STL 库代码里依据双端队列 deque 来构造栈 stack 和队列 queue 。

(7)委托关系:一个类里包含了指向另一个类的指针。把本成员函数的功能,交给另一个类去实现,起名为委托。

(8) 父子继承时 , 除了 public 继承 ,用 protected 或private 继承时, 父类指针或父类引用指向子类对象已没有意义,因为父类指针或父类引用没有权限在子类外访问这些继承自父类的成员。如下图:

( 9 ) 禁止一个类的 copy 构造与赋值运算符的三种方式:

其实还有第三种方式,就是把这俩函数改为 private 修饰,这样外界也就无法使用这两个函数。

(10) 不要直接把 类的成员变量设置为 public ,宜设置为 private ,并对外提供 getData() 这样的成员函数,并且类内定义的成员函数会被视为内联函数,被编译器优化,不会造成效率的下降。

(11) 不要在构造与析构函数中调用虚函数。虚函数在父子函数的定义中是不同的。构造与析构时,类对象在创建或销毁过程中,可能导致无法调用到正确版本的虚函数。父类的构造函数中调用虚函数,调用的还是父类中的虚函数版本,因为子类还没有创建完毕。父类的析构函数调用虚函数,还是调用父类的版本,因为子类的虚函数版本已经被销毁。这是不符合程序员原意的错误。

(12) 一个类的析构函数不被 public 修饰,都会导致无法创建该类的对象。因为编译器无法从外部调用类的析构函数。

(13) 什么样的类无法生成其对象? 含有纯虚函数;默认构造函数等构造函数被 protected 修饰。但可以创建其子类对象。

谢谢

相关推荐
博客18001 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴1 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨2 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4566 天前
C++进阶(1)——前景提要
c++
夜悊6 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴6 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0017 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
LDR0067 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术7 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园7 天前
C++20 Modules 模块详解
java·开发语言·spring