引言

假设我们有这样的类:

 class A{
public:
A(int num = , int den = ) {};
int num() const;
int den() const;
const A operator* (const A& rhs) const;
};

在做乘法时,我们可以采用以下的操作:

     A a0(, );
A a1(, ); A match = a0 * a1; // 同类型相乘
match = match * a0; // 同类型相乘

上述操作是完全木有问题的,那么如果我们想实现跨类型相乘应该怎么做呢?

于是我们开始尝试这样来操作

     match = a0 * ;       // OK        match = a0.operator * 2
match = * a0; // Error match = 2.operator * a0

是的,a0是一个包涵了operator*函数的class的对象,所以编译调用此函数。然而2却没有相应的class,也就没有相对应的operator*函数。

而上面成功的操作中,实际上调用了隐式转换函数,在编译器看来,实际执行的操作为:

 const A temp();     // 基于2建立一个临时对象
match = a0 * temp; // 等同于a0.operator * (temp);

这时如果我们将A的构造函数换成explicit函数,那么上述任何一种情况都不能进行隐式转换,也就没有任何一个语句可以编译通过。

让我们再深挖一些,为什么 match = 2 * a0;就不能通过隐式转换来完成呢?

答案是:只有当参数被列于参数列内,这个参数才是隐式转换的合格参与者。地位相当于”被调用的成员函数所属的那个对象“--即this对象的隐喻参数,不会是合格的参与者。这就是为什么第一次编译通过,而第二次编译不通过的原因:第一次调用伴随着一个放在参数列内的参数,而第二次调用则否。

一、使用non-member函数

如果我们一定要实现跨类型相乘,可以使用non-member来解决。

 class A{
public:
A(int num = , int den = ) {};
int num() const;
int den() const;
};
const A operator* (const A& lhs, const A& rhs) {
return A(lhs.num() * rhs.num(),
lhs.den() * rhs.den());
}

在这种情况下,下面的任意一种情况都可以实现:

     A a0(, );
A a1(, ); A match = a0 * a1;
match = match * a0; match = a0 * ;
match = * a0;

◆总结

如果你需要为某个函数的所有参数(包含被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。

[Effective C++ --024]若所有参数皆需类型转换,请为此采用non-member函数的更多相关文章

  1. 若所有的参数皆需要类型转换——请为此采用non-member函数

    若所有的参数皆需要类型转换--请为此采用non-member函数 经常使用C++的程序猿(希望更多的程序媛),一般不会同意让classes支持类型转换,至于为什么,请看后续的博客.假如我们设计一个表示 ...

  2. Effective C++ -----条款24:若所有参数皆需类型转换,请为此采用non-member函数

    如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.

  3. [EffectiveC++]item24:若所有参数皆需类型转换,请为此采用non-member函数

    Declare non-member functions when type conversions should apply to all parameters. 104页 只有当参数被列于参数列( ...

  4. 【24】若所有参数皆需类型转换,请为此采用non-members函数

    1.令class支持隐式类型转换,往往是个糟糕的主意.但有些情况是合理的,比如数值类型.考虑,有理数Rational有分子,分母两个字段,缺省参数值为0,1.Ration a = 2;我们期望构造一个 ...

  5. 读书笔记_Effective_C++_条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数

    class A { private: int a; public: A(int x) :a(x){} A operator*(const A& x) { return A(a*x.a); } ...

  6. 条款24:若所有参数皆需要类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters)

    NOTE: 1.如果你需要为某个函数的所有参数(包括this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.

  7. 条款24:如果所有的参数都需要类型转换,那么请为此采用non-member函数

    首先还是下面这个class; class Rational{ public: Rational(, ); int numurator() const; int denominator() const; ...

  8. 对setTimeout()第一个参数是字串的深入理解以及eval函数的理解

    <script language="javascript" type="text/javascript"> var a=1; setTimeout( ...

  9. Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...

随机推荐

  1. Hibernate解决高并发问题之:悲观锁 VS 乐观锁

    高并发问题是程序设计所必须要解决的问题,解决此类问题最主要的途径就是对对程序进行加锁控制.hibernate对加锁机制同样做出了实现,常用加锁方式为悲观锁和乐观锁.悲观锁指的是对数据被外界(包括本系统 ...

  2. Vim Vundle 插件管理器

    /********************************************************************** * Vim Vundle 插件管理器 * 说明: * 话 ...

  3. YQL

    YQL,(Yahoo! Query Language)是一种支持对互联网上的数据进行查询.过滤.连接.类似SQL语法的简单语言.用YQL官方的话:有了YQL,开发人员只需要使用一种 简单的查询语言即可 ...

  4. 选择select框跳出信息

    <html > <body > <select type="select" name=s1 onChange=alert("你选择了&quo ...

  5. java类加载器学习2——自定义类加载器和父类委托机制带来的问题

    一.自定义类加载器的一般步骤 Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制.一个类需要被加载的时候,JVM先会调用他的父类加载器进行加载,父类调用父类的父类,一直到顶级类加载 ...

  6. linux下Qt问题cannot find -lGL collect2: error: ld returned 1 exit status

    fedora下解决 yum groupinstall "Development Tools" yum install mesa-libGL-devel ubuntu下解决 sudo ...

  7. Ubuntu 14.04 设置静态IP

    使用Network Manager UI界面中指定 手动时,无法保存. 通过修改配置文件解决来此问题.记录以下. 如果输入过密码后,就会出现在这个目录下面, 以如下chinaNet为例 gaojing ...

  8. 微软Azure云主机及blob存储的网络性能测试

    http://www.cnblogs.com/sennly/p/4137024.html 微软Azure云主机及blob存储的网络性能测试 1. 测试目的 本次测试的目的在于对微软Azure的云主机. ...

  9. Java学习笔记(1)

    封装基本原则之一: 将实例变量标记为private,将getters与setters标记为public,用setters来检查参数并判断是否可以执行: 局部变量与实例变量的区别: 你无需初始实例变量, ...

  10. tRNAscan-SE

    tRNAscan-SE是一款可以在基因组上扫描tRNA的序列,也就是说你给定一组基因序列(fasta数据格式),可以用这个软件去预测这个序列是不是tRNA.具体的实现原理,我不搞生物,所以也就不太明白 ...