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

求生之路2怎么做非官方网站合肥seo招聘

求生之路2怎么做非官方网站,合肥seo招聘,做平台网站一般有php还是js,建筑设计网站模板条款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.yidumall.com/news/51508.html

相关文章:

  • 网站建设方案批发全网营销图片
  • 05网练与测试答案语文优化营商环境条例心得体会
  • 简洁大气的网站北京网站优化快速排名
  • 椒江网站制作google推广
  • 公司网站制作 步骤企业管理
  • bl做视频网站关键词分类哪八种
  • 传奇网站怎么做百度关键词优化策略
  • 东莞营销网站开发百度公司招聘官网
  • 湛江网站模板搜索关键词查询
  • 域名归属查询烟台seo快速排名
  • 做网站翻页怎么做抖音代运营
  • 20亿做网站晋城seo
  • 怎么把一个网站设置成首页泰安网站推广优化
  • 沈阳网站建设聚艺科技seo如何优化图片
  • 网页设计简单的网站搜狗推广登录平台
  • 如何在外管局网站做付汇延期搜索大全引擎入口网站
  • uc投放广告网站要自己做吗深圳竞价排名网络推广
  • 网站开发公司内部数据字典全国新冠疫情最新情况
  • 自命题规划一个企业网站百度竞价电话
  • 网页制作与网站建设教程电话销售外呼系统软件
  • 网站没备案做阿里妈妈百度开户是什么意思
  • 怎么做百度网站免费网站java源码大全
  • 展览展厅设计制作站长seo
  • 怎么用代码做网站推荐下载app到手机上并安装
  • wordpress bt 主题淘宝标题优化网站
  • wordpress插件用户seo技术最新黑帽
  • 域名与网站的区别什么是seo关键词优化
  • 青岛网站推广关键词seo排名优化
  • 杭州百度做网站多少钱百度推广客服人工电话多少
  • 石家庄网站建设联系电话腾讯企业邮箱登录入口