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 修饰。但可以创建其子类对象。

谢谢

相关推荐
zephyr_zeng5 分钟前
VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
帅弟15020 分钟前
Day4 C语言与画面显示练习
c语言·开发语言
qhs157323 分钟前
Kotlin字符串操作在Android开发中的应用示例
android·开发语言·kotlin
Stack Overflow?Tan901 小时前
c++实现在同一台主机两个程序实现实时通信
开发语言·c++
MZWeiei1 小时前
Scala:case class(通俗易懂版)
开发语言·后端·scala
闯闯桑1 小时前
scala 中的@BeanProperty
大数据·开发语言·scala
计算机老学长1 小时前
基于Python的商品销量的数据分析及推荐系统
开发语言·python·数据分析
MZWeiei1 小时前
scala有关 类 的知识点与Java的比较
开发语言·scala
@@永恒2 小时前
map&set
c++