博览网 侯捷老师C++课程 第四周笔记

博览网 侯捷老师C++课程 第四周笔记

  • 兼谈对象模型
  • 目标:在基础上培养正规大气的编程风格、泛型编程、模板、对象之间的继承关系在内存中的结构等。
  • 标准库STL采用模板。

转换函数 conversion function

  • 从一种类型转换成另外一种类型,相互转换。
  • 定义转换函数:函数不可以有参数,没有返回参数。operator 转换类型() const {return 类型}

- 转换函数注意合理性。

non-explicit-one-argument actor

  • (一个实参就够了)非explicit的带一个实参的构造函数。从一个实参构建一个对象。可以把别的东西转换成对象。
  • 转换函数和non-explicit-one-argument actor在一起的时候,会造成二义性,编译器会报错。
  • explicit-one-argument ctor 明确的一参数构造函数,不要不同类型的转换。explicit大部分用在构造函数的前面。

pointer-like classes 关于智能指针

  • 像指针的类,比指针再多一些东西。
  • 智能指针shared_ptr
  • 封装了一个真正的指针,指针所允许的动作该类都支持。*->的操作。T& operator*()const { return *px; } T* operator->()const { return px; }
  • 一个符号作用在对象上就消耗掉了,->符号除外,得到的指针对象继续用箭头符号。
  • 关于标准库STL的迭代器。另外一种类似于指针的类。
  • reference operator*()const { return (*node).data; }//reference 相当于T&
  • pointer operator->() const { return &(operator*());} //pointer 相当于T*

function-like classes 仿函数

  • 函数的特点,函数名称,小括号()-函数调用操作符,可以接受一个小括号作为操作符,那么就可以成为function-like。
  • const T& operator()(const T& x) const {return x;}
  • 一定会重载 ()操作。
  • 标准库中,仿函数都会去继承奇特的base classes.

namespace 经验谈

  • 尽可能使用命名空间,防止变量名和函数名的冲突。

class模板

  • template<typename T> ……T抽象变量类型。

function模板

  • template<typename T>函数定义

成员模板 member template

  • 在模板类中存在一个新的模板,外面的模板是一个允许变化的东西,如果外部变化项确定,里面的变量又可以变化。
  • 把两个继承类构成的pair放进一个有两个基类的pair中是可行的。反之不可以。
  • 父类的指针可以指向子类的对象。up-cast。
  • 智能指针模板为了实现up-cast,必须使用成员模板。

模板特化 specialization

  • 泛化,在用的时候进行类型化。
  • 设计模板之后,想绑定某种类型,就叫做特例化。指定了特定类型后编译器会根据参数选择相关代码。

partial specialization 偏特化

  • 个数上的偏。模板有多个模板参数,对部分参数进行特例化
  • 范围上的偏。从任意类型,特例化到指针这一种类型。

template temeplate parameter 模板模板参数

  • template<typename T, template<typename T> class Container> class XCls{private: Container<T> c;……}
  • XCls<string, list> mylst1; 错误
  • template<typename T> using Lst=list<T, allocator<T>>>; XCls<string, Lst> mylst2; 正确

关于c++标准库

  • 数据结构容器和算法。
  • 多使用标准库,写小例子测试标准库。
  • 测试是否支持c++11,cout<<__cplausplus <<endl;

三个主题(标准库中的新语法)

  • 数量不定的模板参数
  • auto关键字。auto自动确定变量类型。
  • ranged-base for for(decl: coll){statement},注意传值和传引用。for(auto& elem: vec){elem*=3;}

引用 reference

  • int x = 0; int& r = x; sizeof(r) == sizeof(x); &x = &r;
  • object和其引用的大小相同,地址也相同(全都是假象),java里面的变量都是引用。
  • 编译器实现都是使用指针来实现引用,但是在使用时可以从逻辑上把引用当做原值来使用。
  • 声明引用的时候一定要有初值。设置完以后不能再变化。指针可以变化。
  • 引用的地址和原始类型的地址相同
  • 引用通常不用再变量的声明,引用主要用于参数类型(传参数)和返回类型(返回参数)的描述。
  • const是不是函数签名的一部分?是

析构和构造函数

继承关系下的构造和析构

  • 继承类的构造函数首先调用父类的默认构造函数再执行自己。
  • 继承类的析构函数先执行自己再执行父类的析构函数。

复合关系下的构造和析构

  • 拥有者的构造函数先调用组件的默认构造函数,然后再执行自己。
  • 拥有者析构函数先执行自己,然后才地哦啊用组件的析构函数。

继承加复合关系下的构造和析构

  • 继承类的构造函数先执行基类的默认构造函数,然后调用组件的默认构造函数,然后再执行自己。Derived::Derived(……):Base(), Component(){};
  • 继承类的析构函数首先执行自己,然后调用组件的析构函数,然后调用基类的析构函数。Derived::~Derived(……){……~Component(), ~BAse()}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值