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

谢谢

相关推荐
小糖学代码1 小时前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc
handler012 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
小白学大数据2 小时前
现代Python爬虫开发范式:基于Asyncio的高可用架构实战
开发语言·爬虫·python·架构
渔舟小调2 小时前
P19 | 前端加密通信层 pikachuNetwork.js 完整实现
开发语言·前端·javascript
不爱吃炸鸡柳2 小时前
数据结构精讲:树 → 二叉树 → 堆 从入门到实战
开发语言·数据结构
网络安全许木2 小时前
自学渗透测试第21天(基础命令复盘与DVWA熟悉)
开发语言·网络安全·渗透测试·php
t***5442 小时前
如何在Dev-C++中使用Clang编译器
开发语言·c++
码界筑梦坊2 小时前
93-基于Python的中药药材数据可视化分析系统
开发语言·python·信息可视化
Qbw20043 小时前
【Linux】进程地址空间
linux·c++
Cosmoshhhyyy3 小时前
《Effective Java》解读第49条:检查参数的有效性
java·开发语言