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⇒是的,这个答案可能更广泛,但另一个答案做得很好。这一条是针对这个问题的。我认为,两者都是完全恰当的。最好使用适当的术语“绑定”(而不是含糊的“作为左值引用传递”),最好使用适当的术语“绑定”(而不是含糊的“作为左值引用传递”)