当前位置: 首页 > news >正文

求生之路2怎么做非官方网站河南企业网站建设

求生之路2怎么做非官方网站,河南企业网站建设,wordpress 字体库,网站建设开发公司条款24:若所有参数皆需类型转换,请为此采用non-member函数 一、问题引入 举个例子,如果你设计一个表示有理数的类,允许从整型到有理数的隐式转换应该是合理的。在C内置类型中,从int转换到double也是再合理不过的了&a…

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

一、问题引入

举个例子,如果你设计一个表示有理数的类,允许从整型到有理数的隐式转换应该是合理的。在C++内置类型中,从int转换到double也是再合理不过的了(比从double转换到int更加合理)。看下面的例子:

class Rational
{
public://构造函数未设置为explicit,因为我们希望一个int可以隐式转换为RationalRational(int numerator = 0, int denominator = 1);int numerator()const;int denominator()const; const Rational operator*(const Rational& rhs)const;
private:...
};

你想支持有理数的算术运算,比如加法,乘法等等,跟随直觉,我们将函数放进相关 class 内(有时会与面向对象守则发生矛盾,详见条款23),会发生什么?

Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf*oneEighth;//正确
result = result*oneEighth;          //正确

看到以上结果,也许会觉得满足了,但当你进一步尝试混合模式的运算的时候,你会发现只有一半的操作是对的:

Rational res = oneHalf * 2;//正确
Rational result = 2 * oneHalf; //错误

为什么错误?

二、归因分析

将上面的例子用等价的函数形式写出来,你就会知道问题出在哪里:

result = oneHalf.operator*(2); // fine
result = 2.operator*(oneHalf ); // error!

在此分析:

  1. 第一个能通过,其原因在于发生了隐式类型转换,编译器知道函数需要 Rational 类型,但你传递了 int 类型的实参,它们也同样知道通过调用 Rational 的构造函数,可以将你提供的 int 实参转换成一个 Rational 类型实参,这就是编译器所做的。类似于:
const Rational temp(2); // 创建一个临时变量
result = oneHalf * temp; // 等同于oneHalf.operator*(temp);
  1. 第二不能通过,其原因在于 oneHalf 对象是 Rational 类的一个实例,而 Rational 支持 operator 操作,所以编译器能调用这个函数。然而,整型 2 却没有关联的类,也就没有 operator 成员函数。编译器实际会去寻找非成员operator*函数,例如:
result = operator*(2, oneHalf ); 

因此,为了支持混合模式的运算和满足一致性,为了解决 只有参数列表中的参数才有资格进行隐式类型转换,而 this 指针指向的那个,没有资格进行隐式类型转换 的问题,就要采用non-member函数。

三、解决方案

例如,下面将 operator*() 函数变为一个非成员函数:

class Rational
{
public:Rational(int numerator = 0, int denominator = 1);int numerator()const;int denominator()const;
private:...
};const Rational operator*(const Rational& lhs,const Rational& rhs)
{return Rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());
}

使用后,结果如下:

Rational oneFourth(1, 4);
Rational result;
result = oneFourth* 2;
result = 2 * oneFourth;

问题解决,但还有点要注意:operator* 是否该成为Rational class的一个友元函数呢?

答案是否定的,因为 operator* 可以完全依靠Rational的public接口来实现。上面的代码就是一种实现方式。我们能得到一个很重要的结论:成员函数的反义词是非成员函数而不是友元函数

太多的C++程序员认为一个类中的函数如果不是一个成员函数(举个例子,需要为所有参数做类型转换),那么他就应该是一个友元函数。

上面的例子表明这样的推理是有缺陷的。尽量避免使用友元函数,就像生活中的例子,朋友带来的麻烦可能比从它们身上得到的帮助要多。

四、总结

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

http://www.khdw.cn/news/27699.html

相关文章:

  • 做网站销售东西 需要什么资质国内新闻最新消息十条
  • wordpress查看网站内容seo方法
  • 深圳网站关键字优化知名网络营销推广
  • 小说网站建设笺池斋宝鸡百度seo
  • 衢州网站建设精华怎么做app推广代理
  • 自己做网站最新视频教程广告联盟app推广
  • android开发环境有哪些seo日常工作
  • 为国外客户做网站建设n127网推广
  • 做网站的工资高百度惠生活商家入驻
  • 网站开发无使用期限怎么摊销厦门关键词优化网站
  • 东莞市公司网站建设品牌徐州百度seo排名优化
  • 哈尔滨房管局官网查询网络营销中的seo是指
  • 网络营销的定义及其内容是什么企业网站建设优化
  • 外币信用卡怎么做网站上用360地图下载最新版
  • 百度创建网站吗西安百度代运营
  • 购物网站的做客户营销
  • 专业做网站联系方式seo网络优化是做什么的
  • 哈尔滨网站建设设计seo技术教学视频
  • 做网站的不足 心得免费注册域名网站
  • 小程序网站开发怎么样宁波网站推广平台效果好
  • wordpress5.0更新内容百度seo新站优化
  • 广州优俊网站制作公司免费b站在线观看人数在哪儿
  • 小程序项目南宁百度快速优化
  • 用C语言做网站登录界面常见网络营销推广方法
  • 利于优化的网站要备案吗整站排名服务
  • 购物网站如何做新浪博客seo
  • 广东个人备案网站内容seo网站推广首页排名
  • 郑州门户网站建设网站收录平台
  • 震泽做网站安装百度一下
  • 一级做受网站怎样推广自己的广告