[Boolan] C++第四周学习笔记

(1)explicit

大多数用在构造函数,特别是一些库,使用这个关键字较多。禁止编译器编译时进行隐式转换。平常不怎么使用不明白这样有什么用,课堂中有一个让我体会比较深的例子:

class Fraction {
public:
    Fraction(int num, int den=1)
    : m_numerator(num), m_denominator(den) {}
    operator double() const {return (double)(m_numerator/m_denominator)}
    Fraction operator+(const Fraction& f) {……}
private:
    int m_denominator;
    int m_numerator;
};
Fraction f(3,5);
double d=f+4;
执行d=f+4时,因为某些重载fraction+int/double 的操作,编译器可以隐式调用构造函数Fraction(4)将4转成Fraction类型(分母有默认参数),但由于定义了类型转换double(),编译器又可以double(f)将f转为浮点数与4相加,这样就会形成二义性的错误,编译不能通过。

若在 构造函数前加上explicit,构造函数的隐式转换就不被允许,只能double(f),就没有了二义性问题,编译可以。

(2) pointer-like classes

比较典型的就是智能指针和迭代器

另外一个特例 操作符-> 会一直持续执行 例如:

template
class shared_ptr {
public:
    T* operator->() const {return px;}
    shared_ptr(T* p) : px(p) {}
private:
    T* px;
};
shared_ptr sp(new Foo);
sp->method();
最后一行->操作符会持续操作sp->method()  ===>> px->method()  而不是 pxmethod()

(3)仿函数

仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为。目前只是理解了这种概念和用法,具体没有使用过,所以也没有什么感觉,目前保留,这篇博客可以参考http://blog.csdn.net/lbqbraveheart/article/details/7063780

(4)模板的特化 偏特化,模板模板参数,通过课程只是了解到了这方面的概念,但是没有实际应用,所以也先放着。

(5) 引用

int a=5;int b=7;int &c=a;

相当于取了个别名 ,从此以后所有对c的操作等于对a,在操作级数上,引用是属于指针级的,但是引用并不等于指针,因为它不能重新指向,有且只有在声明时确定引用的内容(引用必须要初始化,不能为空),例如c=b;这个时候不是令c指向b,而是赋值操作,令a=b

你可能感兴趣的:(笔记)