您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-11 15:18 579 查看

博览网 侯捷老师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()}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: