C++程序设计课程笔记
C++程序设计
课程介绍
-
OO中最重要的特性--继承, 由virtual function体现; 因此熟悉OO, 熟悉设计virtual function, 一定要深刻理解继承和virtual funciton, 理解其底层如何支撑其特性
-
C++的另一重要技术--泛型编程, 由template体现; 因此要深刻理解template
Conversion Function转换函数
- 设计class时, 要考虑是否可以转换为其他类型, 其他类型是否可以转换为当前class
- 这是转换的两个方面, 作为class的设计者, 有责任去思考如何设计合理的转换
- 语法:
operator TYPE() const {}
- 不需要返回值和参数, 因为Conversion而已, 返回值肯定是TYPE; 也不需要修改成员的值, 因此设计为const; 这些合理的设计, 是class的设计者的责任
explicit-one-argument constructor
-
双操作数符号+调用
Fraction operator+(const Fraction& f){}
进行相加 -
实数4作为参数进行传递, 调用constructor构造为Fraction(4, 1)
-
explicit指定
Fraction(int num, int den=1){}
只能作为构造函数使用, 即变量创建时以num和den进行初始化 -
因此实数4不会被构造为一个Fraction, 代码编译报错
-
若没有explicit指定, 4可以构造为Fraction, 变量f可以转换为double, 出现了ambiguous, 编译报错
-
explicit指定构造函数只能作为构造函数使用
-
vector<bool, Alloc>
的[]
操作, 返回应该为bool
, STL中返回reference
-
此处为代理设计模式
-
因此需要conversion function, 将类型
reference
转换为类型bool
-
语法
operator bool() const {}
, 与我们在Fraction
中设计的一模一样, 无返回值-无参数-const -
写代码复现了一下, 调用overload的+时, 将4隐式构造为一个Fraction
-
此处只有conversion function call, 构造函数被explicit指定
-
ambiguous的报错,
Fraction f
和4
可以进行双向的转换, 因此编译器不知如何选择, 设计者没有指定优劣, 也没有指定取舍
class template
- 设计class时, 将可以由使用者指定的类型抽出来, 由使用者进行指定; 即任意类型都可以
- 这里只跟类型有关系, 跟变量无关; 即无论何种含义的变量, 只要类型可以由使用者指定即可
- 定义
template<typename T> class TEST {}
- 使用
TEST<int> t;
- class template需要显式的指定类型
- 设计template时无问题, 使用时可能会出现问题, 即指定类型时
function template
- 设计function时, 将可以由使用者指定的类型抽出来, 由使用者进行指定; 即函数可以接受任意类型
- 定义
template<class T> void foo(T x) {}
- 使用
int x; foo(x);
- function template使用时, 编译器会进行argument deduction, 判断传入参数的类型并指定
class
与typename
等价
member template
- 用
MyPair<int, int>
构造MyPair<double, double>
int
可以转换为double
, 若采用继承关系的class构造时, 要考虑是否可以进行转换;- 子类可以初始化父类, 反之不可以; 当类型指定为某一子类时, 父类不是其类型, 其他子类也不是其类型; 此处可以理解为类型已指定
- 若类型相同, 即用
MyPair<int, int>
构造MyPair<int, int>
, 会调用默认拷贝构造函数, 进行每一个member的拷贝
关于vptr和vtbl
- 多态, 虚函数, 虚指针+虚表, 动态绑定
谈谈const
- 函数签名包含const
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人