Boolan c++笔记_4

C++程序设计(II)兼谈对象模型

摘要

第三讲主要讲解了C++语法上的一些重要的知识,包括对象和其他类型之间的转换、像指针一样的类、像函数一样的类(这样的形容方式在我看来恰到好处,生动形象~~)、各种类型的模板、三个c++11的主题(pack、auto、基于范围的for)、以及对引用的深入剖析。还谈到面向对象编程和泛型编程是c++技术的主流。c++的标准库主要运用这两种编程思想所写。

1. 对象和其他类型之间的转换

1.1 conversion function转换函数——将对象转换为其他类型

转换函数是类中的成员函数,可以转换为任意类型,包括先前自定义的类型。
特点:不用写返回值类型,实际上返回类型是operator后面的类型;没有函数的参数;最好加const。

eg.表示分数的类中,包含分子和分母,要转换为分数。
Fraction::operator double() const
{
     return (double)(m_a/m_b);
}
使用方法:
Fraction f(3, 5); 
double d = f + 4; (首先编译器会找有没有对加号的重载和有没有对f转换为double类型的重载,这两种方式不能同时存在,找到哪种就采用哪种方法运算,此处就是要将f转换为double,再相加。)
1.2 explicit——隐式的将其他类型转换为对象

还是继续以上面为例,eg. double d = f + 4; 如果有对加号进行重载(两个Fraction对象相加),没有定义double转换函数时,编译器会将4隐式转换为Fraction对象(Fraction类中存在只有一个实参one argument的构造函数没有声明为explicit的情况下),再相加。
当double转换函数和对加号运算符重载都存在的,且只有一个实参的构造函数没有声明为explicit的情况下,编译时会产生歧义ambiguous,因为有两种方案进行double d = f+4,一种是将f转换为double,一种是将4隐式转换为Fraction对象。

2. 两种特殊的类

2.1 pointer-like class
  • 智能指针share_ptr:会重载*和->运算符。
  • 迭代器:会重载*、->、++、--、==、!=。。。
2.2 function-like class

有重载()运算符的类,那么这种类的对象叫做函数对象(泛函数)。
标准库中的泛函数都会继承于父类,这些父类没有成员函数和数据成员,但有一些typedef.

3. template模板

3.1 class template类模板
template<typename T>
class test
{
};
3.2 function template函数模板

template<typename T> inline void test();

3.3 member template成员模板

标准库中一些构造函数使用成员模板。
Base1 *ptr = new Derived1; //up-cast指针向上转型,利用基类的指针指向派生类对象

3.4 specialization模板特化

特化是泛化的反义词,泛化就是模板,泛化又叫全full特化。特化是对模板的特征化,具体化。有特化和泛化,会优先调用特化。特化可以有多个。

template <typename T>
struct hash { };

template <>
struct hash<long>
{
    size_t operator ()(long x) const  { return x; }
};
cout << hash<long>()(1000);
其中hash<long>()表示临时对象,(1000)表示调用小括号运算符重载的函数
3.5 partial specialization偏特化

(1)个数的偏:从左到右连续绑定一个或多个typename.
(2)范围的偏:将typename T的T的类型范围缩小,由任意类型缩小为指针。

3.6 template template parameter模板模板参数
template<typename T, template <typename T> class Container> 第二个模板参数也是个模板。使用时并不绑定类型,是模板模板参数。
template<typename T, class Sequence = deque<T> > //第二个模板参数具有默认值,使用时会绑定类型,所以这个不是模板模板参数。

4. 关于c++标准

算法+数据结构=程序
确认编译器是否支持C++11,cout << __cplusplus << endl;
一般返回201103或是199711,或是2014..

5. 三个c++11主题

(1)variadic templates(since c++11) 模板支持不确定模板参数的个数。
template<typename T, typename... Types> ...表示一包pack
void print(const T& firstArg, const Types &args){}
eg. print函数进行递归打印参数,开始时传入一个参数和一包,最后一次传入时,没有参数会调用无参的print函数。
sizeof...(args)得到这个pack中参数的个数。
(2)auto(c++11)
要让编译器能推导出来是什么类型,需要对auto变量定义的同时赋值。
(3)ranged-base for(c++11)
for(变量:容器) {...} 编译器会将容器中每个元素赋值给变量。传值不会对容器中对应的值做更改,传引用容器中才会被修改。与算法中的for_each用同样作用。
{1,4,6,7,9} 这种表示也来自c++11,表示一个容器。

6.引用

特点:引用的底层由指针实现,但逻辑上它的值是所引用变量的值。引用可以赋值为另一个引用。可以通过引用改变对应的变量的值。一个引用不能再去引用其他变量。对象和其引用的大小和地址都相同(假象)。
引用多用于函数传参和作为返回值类型,函数中引用与对象的用法(.)相同,与传入指针用法(->)不同。外面传参数时,引用和对象用法也一致,指针则需要加&。
int &r=x; r和x的sizeof大小和地址都相同(这都是假象)。
像double func(const double x)和double func(const double &x)这两个函数不能同时存在,被认为签名signature是相同的(签名是否相同包含比较函数名和其参数,还有是否是const函数,不包含对返回值类型的比较),如果同时存在这两个函数,都是通过double t; func(t);这种写法在外部调用的,编译器无法识别是调用的哪个函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容