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

昆明移动网站建设dw网页制作论文

昆明移动网站建设,dw网页制作论文,四年级说新闻2023,游戏网页设计条款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.yayakq.cn/news/628974/

相关文章:

  • 网站开发的工作经验windows与wordpress
  • 厦门 网站设计腾讯云服务器如何建设网站
  • 设计一个官方网站推广广告网页制造基础课程
  • 惠州做网站建设做的网站每年都要收费吗
  • 烟台网站快速优化排名杭州旅游团购网站建设
  • 乐清网站制作推荐网站建设预算方案模板
  • 怎样做网站推销产品网站建设的内容要怎么写
  • 企业网站网络营销上海平台推广的公司
  • 自己做网站要服务器吗响水做网站需要多少钱
  • zedu小语种网站建设陕西科技网站建设
  • 网站开发 数据库对比抖音电商官网
  • 建立网站需要什么技术衡东网站制作
  • 网站模块划分规划wordpress头像缓存到本地
  • 智能网站建设维护软件推广普通话手抄报内容怎么写
  • 南昌的网站建设公司视频下载软件
  • 比较好的网站开发福建省建设厅网站官网
  • 网站建设需要注意的问题做网站后台要学
  • 创意网站建设公司wordpress模板替换
  • 自己做的网站容易被黑吗网站开发的相关岗位
  • 溧阳市建设局网站6网站建设需要什么材料
  • 特级a做爰网站剪辑素材网站
  • 重庆做网站开发的公司有哪些南宁房地产最新消息
  • 友情链接的网站在汕头的网络公司有哪些
  • ui设计师怎么做简历网站南阳做网站收费
  • 百度联盟网站备案信息普升高端品牌网站建设
  • 酒类网站建设策划书网站设计与程序方向
  • 牡丹江建设厅网站关于建设教体局网站的申请
  • 网站建设公司资料大全肇庆百度快速排名
  • 网站兼容视图成都房地产公司排名
  • 常宁网站建设渝北网站制作