C++ 重载==运算符时,常量参数是必需的吗?
在第一次代码提取中,所有参数都是C++ 重载==运算符时,常量参数是必需的吗?,c++,operator-overloading,C++,Operator Overloading,在第一次代码提取中,所有参数都是const,代码编译成功。在第二个代码提取中,参数为non-const,代码异常失败,返回消息: 可能是'bool operator==(Date&,Date&')'[使用参数相关查找找到] 这是因为==运算符必须采用常量参数吗 首先 第二 int serialDate() { return m_date.serialNumber(); } friend bool operator == (Date& a, Date& b) {
const
,代码编译成功。在第二个代码提取中,参数为non-const
,代码异常失败,返回消息:
可能是'bool operator==(Date&,Date&')'[使用参数相关查找找到]
这是因为==
运算符必须采用常量
参数吗
首先
第二
int serialDate()
{
return m_date.serialNumber();
}
friend bool operator == (Date& a, Date& b)
{
return (a.serialDate() == b.serialDate());
}
根据要求,这里是我的第二个代码片段的代码,它通过(非常量)引用传递给比较例程的日期对象 代码中有我添加的内容来填补缺失的部分。代码编译、运行并生成预期的输出
#include <iostream>
using std::cout;
namespace {
struct SerialNumber {
int d;
int serialNumber() { return d; }
};
struct Date {
SerialNumber m_date;
int serialDate() {
return m_date.serialNumber();
}
friend bool operator==(Date& a, Date& b) {
return a.serialDate() == b.serialDate();
}
};
} // anon
int main() {
auto d1 = Date{{5}};
auto d2 = Date{{5}};
if (d1 == d2) {
cout << "These are the same date.\n";
} else {
cout << "These are different dates.\n";
}
}
#包括
使用std::cout;
名称空间{
结构序列号{
int d;
int serialNumber(){return d;}
};
结构日期{
序号m_日期;
int serialDate(){
返回m_date.serialNumber();
}
friend bool运算符==(日期和a、日期和b){
返回a.serialDate()==b.serialDate();
}
};
}//阿农
int main(){
自动d1=日期{5};
自动d2=日期{5};
如果(d1==d2){
这不是语言所要求的,但它是惯例所要求的。为什么你会禁止与const
实例进行比较?我的问题是,为什么你会禁止与非const引用进行比较?为什么第二个代码提取无法编译?@Marco我的问题是,为什么你不想标记参数const这里的概念是,您告诉世界,在进行比较时,您承诺不会更改正在比较的值。@Marco很难说为什么它在没有更多信息的情况下无法编译。根据代码和错误消息,听起来您好像在尝试使用操作符比较常量
实例==(Date&,Date&);
@Marco注意:没有常量值会绑定到常量参数。谢谢。我使用的代码与此非常相似。我将深入研究Date成员类。
#include <iostream>
using std::cout;
namespace {
struct SerialNumber {
int d;
int serialNumber() { return d; }
};
struct Date {
SerialNumber m_date;
int serialDate() {
return m_date.serialNumber();
}
friend bool operator==(Date& a, Date& b) {
return a.serialDate() == b.serialDate();
}
};
} // anon
int main() {
auto d1 = Date{{5}};
auto d2 = Date{{5}};
if (d1 == d2) {
cout << "These are the same date.\n";
} else {
cout << "These are different dates.\n";
}
}