Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;运算符重载_C++_Operator Overloading - Fatal编程技术网

C++ C++;运算符重载

C++ C++;运算符重载,c++,operator-overloading,C++,Operator Overloading,今天我的老师给我看了下面的例子: CFraction operator*(const CFraction &a, const CFraction &b){ CFraction x; x.setNumerator(a.getNumerator()*b.getNumerator()); x.setDenominator(a.getDenominator()*b.getDenominator()); return x; } // ... void main

今天我的老师给我看了下面的例子:

CFraction operator*(const CFraction &a, const CFraction &b){ 
   CFraction x;
   x.setNumerator(a.getNumerator()*b.getNumerator());
   x.setDenominator(a.getDenominator()*b.getDenominator());
   return x;
}

// ...

void main(){
   CFraction b1,b2(3,7),b3(5,8);
   b2=b1*3;   
   b2=3*b1;  
}
他说上述代码可以正常工作,但如果您将方法更改为以下内容:

CFraction operator*(CFraction&,CFraction&);
 CFraction b1,b2(3,7),b3(5,8);
 b3=b1*3;
这是行不通的。为什么呢

希望你能给我解释一下

提前谢谢

这是行不通的。为什么呢

让我们看看你的表情:

b2=b1*3;
等于:

b2=operator*(b1,3);
由于第二种类型不是牵引类型,因此必须将其转换为牵引类型,即:

b2=operator*(b1,CFraction(3));
CFraction(3)
创建类型为
CFraction
的临时对象。临时不是左值,因此不能作为左值引用传递-
CFraction&
,如果使用非常量引用(又称左值引用)定义函数,则在这种情况下不起作用

这是行不通的。为什么呢

让我们看看你的表情:

b2=b1*3;
等于:

b2=operator*(b1,3);
由于第二种类型不是牵引类型,因此必须将其转换为牵引类型,即:

b2=operator*(b1,CFraction(3));
CFraction(3)
创建类型为
CFraction
的临时对象。临时不是左值,因此不能作为左值引用传递-
CFraction&
,如果使用非常量引用(又称左值引用)定义函数,在这种情况下将不起作用。

您基本上是在问,“为什么我的参数应该是常量?”

在这种情况下,实际上有一个很好的理由。在C++中,每当你有一个函数引用的一个const引用,(除了其他的东西),这意味着你可以把一个文字作为一个参数传递到那个函数中(假设一个类型转换的容量是可用的)。 例如,如果不使用const引用,仍然可以执行以下操作:

 CFraction b1,b2(3,7),b3(5,8);
 b3=b1*b2;
在前面的示例中,您传入了对对象b1和b2的(非常量)引用。没关系,因为这个表达式有意义。但是,您无法执行以下操作:

CFraction operator*(CFraction&,CFraction&);
 CFraction b1,b2(3,7),b3(5,8);
 b3=b1*3;
为什么??因为3是一个文字。只要不包含对CFraction的const引用,就不能将文本作为参数传递到该函数中。使用常量引用可以传递文本值。

您基本上是在问,“为什么我的参数应该是常量?”

在这种情况下,实际上有一个很好的理由。在C++中,每当你有一个函数引用的一个const引用,(除了其他的东西),这意味着你可以把一个文字作为一个参数传递到那个函数中(假设一个类型转换的容量是可用的)。 例如,如果不使用const引用,仍然可以执行以下操作:

 CFraction b1,b2(3,7),b3(5,8);
 b3=b1*b2;
在前面的示例中,您传入了对对象b1和b2的(非常量)引用。没关系,因为这个表达式有意义。但是,您无法执行以下操作:

CFraction operator*(CFraction&,CFraction&);
 CFraction b1,b2(3,7),b3(5,8);
 b3=b1*3;


为什么??因为3是一个文字。只要不包含对CFraction的const引用,就不能将文本作为参数传递到该函数中。使用const-reference可以传递文本值。

您需要仔细阅读const-reference绑定。尝试一下,编译器会告诉您。除非您使用的是MSVC,否则我相信它将继续作为一个扩展。在您的示例中,计算b2时不可能对3这样的文本进行无常量引用。您需要阅读常量引用绑定。尝试一下,编译器会告诉您。除非您使用的是MSVC,否则我相信它将继续作为一个扩展工作。在您的示例中,计算b2时不可能对3这样的文本进行无常量引用。不需要关注文本。@SergeyA它不会使响应不正确。这是对斯拉瓦已经提供的信息的补充回答。@SergeyA:似乎完全相关。@BarryTheHatchet,这让人觉得如果不是文字,它会很好地工作。例如,
static int i;b3=b1*i-这看起来可以吗?看不到令人讨厌的文字?@SergeyA:讨论⇒C也不禁止B⇒是的,这个答案可能更广泛,但另一个答案做得很好。这一条是针对这个问题的。我认为,两者都是完全合适的。不需要关注文字。@SergeyA这不会使回答不正确。这是对斯拉瓦已经提供的信息的补充回答。@SergeyA:似乎完全相关。@BarryTheHatchet,这让人觉得如果不是文字,它会很好地工作。例如,
static int i;b3=b1*i-这看起来可以吗?看不到令人讨厌的文字?@SergeyA:讨论⇒C也不禁止B⇒是的,这个答案可能更广泛,但另一个答案做得很好。这一条是针对这个问题的。我认为,两者都是完全恰当的。最好使用适当的术语“绑定”(而不是含糊的“作为左值引用传递”),最好使用适当的术语“绑定”(而不是含糊的“作为左值引用传递”)