Boolan C++面向对象高级编程(下)第一周
最近两次写笔记作业都很痛苦,因为感觉重复课程内容和书上的东西实在是没什么意思,下周绝对换个做法。这周的笔记实在太少了,但是我实在是写不下去了。
转换函数
只要认为是合理的,就可以为自己的类写转换函数,转换成任意合理的类型(内置的或自定义的)。自定义的类型的定义需要在调用点可见。内部由自己设计。比如一个分数类,在使用中有可能被当作double,这时就可以为分数类写一个从分数到double的转换函数。我觉得这个转换函数也可以用重载的运算符替代。比如第一周的complex.
转换函数在代理模式(proxy)中有应用。代理模式中用一种类型代替另一种类型,这时往往需要写一个从这两种类型中的某一方转换到另一方的转换函数。
explicit
class Fraction
{
public:
Fraction(int num, int den = 1)
:m_numerrator(num),m_denominator(den){}
operator double() const
{
return (double)(m_numerrator / m_denominator);
}
private:
int m_numerrator;
int m_denominator;
};
这段代码中的构造函数是non-explict one-argument constructor, 在实际使用中可以隐式地把一个double转换为分数(但是它并不算作转换函数)。注意这段代码中的构造函数和转换函数在实际使用中会造成二义性调用,构造函数将double转为分数,转换函数将分数转为double,这两个函数并没有谁比谁好,因此编译器会不知道要调用哪一个。要避免这种情况,需要在构造函数前面加上explicit:
explicit Fraction(int num, int den = 1)
:m_numerrator(num), m_denominator(den) {}
这样这个函数就限制了从double到分数的隐式转换。