[GeekBand][C++面向对象高级编程(下)]第四周笔记

第四周内容比较的散,大纲如下

  1. Conversion Function
  2. non-explicit one argument constructor
  3. pointer-like classes
  4. Function-like classes
  5. namespace经验谈
  6. class template
  7. Function Template
  8. Member Template
  9. specialization
  10. 模板偏特化
  11. 模板模板参数
  12. 关于C++标准库
  13. 三个主题
  14. Reference
  15. 复合&继承关系下的构造和析构

第四周的内容也是相对零零散散,有虚函数指针vptr,虚函数表vtbl的,有this指针,有动态绑定Dynamic Binding。后边还讲到了成员函数。能写多少写多少吧。

  1. Conversion Function
Operator 类型名(){转换语句}

比如这个例子:

#include<iostream>
using namespace std;
class Fraction
{
public:
    Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) { }
    operator double( ) const 
    { 
        cout<<"operator double( ) is called!!!"<<endl;
        return (double)(m_numerator / m_denominator); 
    }
private:
    int m_numerator; //分子
    int m_denominator; //分母
};

int main( )
{
    Fraction f(3, 5);
    double d = 4+f;   //调用operator double( ) 将f 转换为0.6.
    return 0;
}

转换函数在函数名前面不能指定函数类型,函数也没有参数,至于是否要加const,根据转换后的结果来判定,一般都会加上const。在使用过程中,不必显示地调用类型转换函数,它往往是自动被调用的,即隐式调用。

23转换构造函数:一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数)。

它有两个作用:一是构造器,二是默认且隐式的类型转换操作符。

  1. 关键字explicit:

Explicit用于防止隐式转换的,普通的构造函数能过被隐式调用,而explicit构造函数只能被显示调用。

non-explicit-one-argument ctor 可隐式转换单一形参构造函数形如:

#include<iostream>
using namespace std;
class Fraction
{
public:
    Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den)
    { 
        cout<<"non-explicit ctor is called!!!"<<endl;
    }
    Fraction operator + (const Fraction &f)  
    { 
        cout<<"operator +(...) is called!!!"<<endl;
        return Fraction(this->m_numerator+f.m_numerator, this->m_denominator+f.m_denominator);
    }

    int getNumerator() const {return m_numerator;}
    int getDenominator() const {return m_denominator;}

private:
    int m_numerator;    //分子
    int m_denominator;  //分母
};

ostream& operator<<(ostream &os, const Fraction &f)//重载<<运算符
{
    return os<<"分子: "<<f.getNumerator()<<"分母: "<<f.getDenominator();
}

int main( )
{
    Fraction f(3, 5);        //调用non-explicit ctor
    Fraction d2 = f+4;       //调用non-explicit ctor将4转为 Fraction(4,1)
                             //然后调用operator + 
    cout<<d2<<endl;          //因为引用传递,所以会再调用一次non-explicit ctor
    return 0;
}

  1. shared_ptr是一种智能指针(smart point),它会记录有多少个shared_ptr共享一个对象。当最后一个指向对象的指针被销毁,这个对象就会被自动删除。
**shared_ptr<int> sp(new int(10));                //一个指向整数的shared_ptr    
assert(sp.unique());                            //现在shared_ptr是指针的唯一持有者     
shared_ptr<int> sp2 = sp;                       //第二个shared_ptr,拷贝构造函数     
assert(sp == sp2 && sp.use_count() == 2);       //两个shared_ptr相等,指向同一个对象,引用计数为2    
*sp2 = 100;                                     //使用解引用操作符修改被指对象    
assert(*sp == 100);                             //另一个shared_ptr也同时被修改     
sp.reset();                                     //停止shared_ptr的使用    
assert(!sp);                                    //sp不再持有任何指针(空指针) 
**

网上的例子。

  1. 迭代器(iterator)

迭代器提供对一个容器中的对象的访问方法,并定义了容器中对象的范围。迭代器就如同一个指针。

  1. typename
    这周课侯老师讲了在泛型编程中typename和class具体有无区别。侯老师也讲了,在模板声明里是完全没用区别的。侯老师也提到了在模板里面的使用是有些微的区别的。但是限于篇幅与时间的限制,侯老师并没有深入讨论,所以在本笔记中,我们会讨论typename与class的区别。
    比如我们有一个模板函数,该函数可以打印容器内的所有元素。如下图所示,即使没有typename,函数也能运行。

可是,如果我们写一个自己的容器类,不但有const_iterator这一迭代器类型,还有一个静态变量也叫const_iterator。这时候编译器就会会出现解析错误了。因为我们知道,静变量可以通过使用类名::变量名调用的。所以T::const_iterator不但是一个类型名还是一个变量名,这时候就要加入typename了。

  1. 范围for语句

C++11新引入了一种更简单的for语句,用于遍历容器或其它序列的所有元素。

语法结构:

for(declaration : expression){

         ……

}

expression为要遍历的容器

declaration为变量类型,用于存放容器中的元素,若是不清楚容器中的元素类型,可以使用auto类型说明符。

例如:

vector<int> v={0,1,2,3,4,5,6,7,8,9};

for(auto r:v)

{

         cout<<r<<endl;

}

在上面的代码中提到了auto,它是类型说明符。

在编程时,常常需要把表达是的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的类型,然而,往往做不到这一点,所以引入了auto类型说明符,它让编译器通过初始值来推算变量的类型。所以,auto定义的变量一定要有初始值。

6.[GeekBand][C++面向对象高级编程(下)]第四周作业
作业解答在这里

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

推荐阅读更多精彩内容