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){}只能作为构造函数使用, 即变量创建时以numden进行初始化

  • 因此实数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

TEST-explicit

  • 此处只有conversion function call, 构造函数被explicit指定

  • ambiguous的报错, Fraction f4可以进行双向的转换, 因此编译器不知如何选择, 设计者没有指定优劣, 也没有指定取舍

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, 判断传入参数的类型并指定
  • classtypename等价

member template

  • MyPair<int, int>构造MyPair<double, double>
  • int可以转换为double, 若采用继承关系的class构造时, 要考虑是否可以进行转换;
  • 子类可以初始化父类, 反之不可以; 当类型指定为某一子类时, 父类不是其类型, 其他子类也不是其类型; 此处可以理解为类型已指定
  • 若类型相同, 即用MyPair<int, int>构造MyPair<int, int>, 会调用默认拷贝构造函数, 进行每一个member的拷贝

关于vptr和vtbl

  • 多态, 虚函数, 虚指针+虚表, 动态绑定

谈谈const

  • 函数签名包含const
posted @   Figure_at_a_Window  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示