博览网 侯捷老师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()}
相关文章推荐
- 博览网 侯捷老师C++课程 第五周笔记
- Boolan* C++课程第四周笔记
- 博览网C++课程 第四周
- 博览网 c++课程 第二周课程笔记
- 博览网 c++课程 第三周 组合与继承
- [张龙老师Java课程笔记]Java SE第二课 原生数据类型
- 极客班C++设计模式第二周课程笔记——常用模式(2)
- 极客班C++设计模式第二周课程笔记——常用模式(3)
- 赵强老师oracle课程笔记(基本查询)
- 机器学习——Andrew NG老师课程学习笔记
- 博览网C++课程 第二周
- C++课程笔记(2)——Part1 Basic Facilities
- 《笔记》孙鑫老师MFC第二讲(C++特性)
- 博览网C++课程 第五周
- 博览网C++课程 第六周
- 博览网C++课程 第三周
- 《IT播吧.-.大灰狼老师出品的零基础汇编视频课程》学习笔记
- 侯捷 more effective c++(WQ中文版) 阅读笔记1
- 极客班C++(上)第一周课程笔记
- 侯捷老师C++大系之C++面向对象开发:(一)不带指针的类:Complex复数类的实现过程