若所有的参数皆需要类型转换--请为此采用non-member函数 经常使用C++的程序猿(希望更多的程序媛),一般不会同意让classes支持类型转换,至于为什么,请看后续的博客.假如我们设计一个表示有理数的class,允许"整数隐式转换为有理数似乎很合理".首先来一个简单的实现. class Rational { public: Rational(int numerator = 0,int denominator = 1; //允许int-to-Rational隐式转换 int nu…
NOTE: 1.如果你需要为某个函数的所有参数(包括this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.…
Declare non-member functions when type conversions should apply to all parameters. 104页 只有当参数被列于参数列(parameter list)内,这个参数才是隐式类型转换的合格参与者. 这就是为什么上述第一次调用可通过编译,第二次调用则否.因为第一次调用伴随一个放在参数列内的参数,第二次调用则否.…
如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.…
首先还是下面这个class; class Rational{ public: Rational(, ); int numurator() const; int denominator() const; // getter; }; 想要支持operator*的时候我们首先可能想到的是两种选择,一种是member operator*(),还有一种就是friend operator*().   首先,member function版本的operator*带来的问题是, rational * 2可以正常…
1.令class支持隐式类型转换,往往是个糟糕的主意.但有些情况是合理的,比如数值类型.考虑,有理数Rational有分子,分母两个字段,缺省参数值为0,1.Ration a = 2;我们期望构造一个分子为2,分母为1的有理数,这是非常合理和自然的.因此,Rational的构造方法为Ration(int numerator =0, int denominator =1);不添加explicit. 2.考虑Rational 有个成员方法 operator*,如下: const Ration ope…
class A { private: int a; public: A(int x) :a(x){} A operator*(const A& x) { return A(a*x.a); } }; int main() { A a(); A b = a*a;//没有问题 A b = a * ;//由于构造函数没有explicit,这里隐式转换了,也没有问题 A b = * a;//出问题了 } 老师讲过,一种是类的member函数,一种是non-member函数, 但我们为了封装性,尽量不适用f…
引言 假设我们有这样的类: class A{ public: A(, ) {}; int num() const; int den() const; const A operator* (const A& rhs) const; }; 在做乘法时,我们可以采用以下的操作: A a0(, ); A a1(, ); A match = a0 * a1; // 同类型相乘 match = match * a0; // 同类型相乘 上述操作是完全木有问题的,那么如果我们想实现跨类型相乘应该怎么做呢? 于…
若全部參数皆需类型转换,请为此採用non-member函数 我们直奔主题 假设你定义一个有理数类例如以下 class Rational{ public: Rational(int numerator=0, int denominator=1);//非explicit.同意隐式转换 const Rational operator*(const Rational& rhs); ....................... }; result=oneHalf*2;//正确.相当于oneHalf.op…
这个条款可以看成是条款24的续集,我们先简单回顾一下条款24,它说了为什么类似于operator *这样的重载运算符要定义成非成员函数(是为了保证混合乘法2*SomeRational或者SomeRational*2都可以通过编译,2不能同时进行隐式类型转换成某个Rational,再作this用). 所以我们一般将之定义成友元函数,像下面这样: class Rational { private: int numerator; int denominator; public: Rational(,…