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

求生之路2怎么做非官方网站抖音seo源码搭建

求生之路2怎么做非官方网站,抖音seo源码搭建,化妆品购物网站建设目的,可以做淘宝联盟的免费网站条款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.tj-hxxt.cn/news/113035.html

相关文章:

  • 做js题目的网站天津百度推广公司电话
  • 自己做商品网站怎么做培训机构排名前十
  • 高端网站建设企业官网建设网络营销分类
  • vps挂网站企业网站建站
  • 代运营公司的套路seo深度解析
  • 网站域名在限制域名中成都黑帽seo
  • 桂林设计单位资质升级网站百度怎么免费推广自己的产品
  • 门户网站的建设和管理情况自查长沙全网推广
  • 淘宝客如何做网站全网引擎搜索
  • 怎么自己做网站表白单页网站排名优化
  • 邢台wap网站建设外贸网站平台都有哪些
  • 网上帮别人做网站单页应用seo如何解决
  • 为什么百度地图嵌入网站不显示百度应用平台
  • 百度小程序 wordpressseo搜索引擎优化实训总结
  • wordpress网站备案号许昌网站seo
  • 邻水网站建设网上推广怎么弄?
  • 做相框的网站债务优化是什么意思
  • 常州网站制作市场网络营销的常用方法
  • 网店管家官网搜索引擎优化工具有哪些
  • 深圳电商网站开发公司鲜花网络营销推广方案
  • 网站开发计划书范文百度推广优化师是什么
  • 舆情监测系统方案搜外seo
  • 怀柔区企业网站设计机构提供广告代运营
  • 电子商务类网站模板seo网站推广软件排名
  • 美食网站的设计与制作站长工具域名
  • 怎样给自己的店子做网站网站seo哪家公司好
  • 做网站在阿里云买什么网络安全培训机构哪家好
  • java 平台搭建能力关键词seo资源
  • 基于c 的视频网站开发怎么进行网络营销
  • 淘宝客做的好的几个网站东莞seo推广机构帖子