这些C++运算符重载有什么问题?
What is wrong with these C++ operator overloadings?
这些是作为不正确使用运算符重载的示例给出的,但我不确定为什么会这样。这是就C++而言,我也不太熟悉。谁能解释为什么如果使用它们就不起作用?我知道它们不是完整的代码,但我认为格式是这里强调的问题。
(1)
class Mystery //Line 1
{
...
bool operator <= (Mystery); //Line 2
...
};
bool Mystery::<=(Mystery rightObj) //Line 3
{
...
}
(二)
class Mystery //Line 1
{
...
bool operator <= (Mystery, Mystery); //Line 2
...
};
(三)
class Mystery //Line 1
{
...
friend operator+ (Mystery); //Line 2
//Overload the binary operator +
...
};
我会尝试比到目前为止的答案更彻底一点:
(1)
bool operator <= (Mystery); //Line 2
-
调用的常量正确性。运算符
<=
不应修改调用它的实例,并且应该通过尾随const
修饰符指示不这样做:bool operator <= (Mystery) const;
-
其他人都建议正确的参数应该通过 const 引用传递,但这里取决于类包含的内容。数字通常按值传递,如果
Mystery
仅包含一个基元类型的成员,并且具有默认或内联复制构造函数,则按值传递可能是合适的。按值传递时,参数显然无法修改,因此您无需关心const
。也适用于所有其他情况。使用常量引用bool operator <= (Mystery const &) const;
更常见,因为大多数用户类确实包含不止一个或两个数字,对于微不足道的情况,通常一切都是内联的,编译器将根据需要对其进行优化。
-
如果类具有任何适合类型转换的构造函数(来自不同类型的非显式单参数构造函数),则应将运算符重载为非成员函数(如案例(3) 中的
operator+
)。这是因为如果参数只能转换为
Mystery
,则会找到非成员operator<=
,而只有当左运算符是Mystery
或派生类型时,才会找到成员运算符。仅当至少有一个参数是用户定义类型时,才考虑重载运算符,即编译器不会考虑对类型
(int, int)
的参数进行bool operator<=(Mystery, Mystery)
,即使有一个Mystery::Mystery(int)
构造函数可以使其进行可行的转换。但是,它将考虑非成员运算符作为(int, Mystery)
参数列表,而不会考虑成员bool Mystery::operator<<(Mystery) const
运算符。
bool Mystery::<=(Mystery rightObj) //Line 3
缺少operator
关键字。
bool Mystery::operator<=(Mystery rightObj)
(二)
bool operator <= (Mystery, Mystery); //Line 2
签名不正确。operator<=
需要 2 个参数,其中一个是调用参数,因此只需要一个显式参数。
(三)
friend operator+ (Mystery); //Line 2
这是指非会员operator+
。
由于
operator+
也是二元运算符,因此需要两个参数。运算符
+
需要返回类型。返回类型通常应该是参数类的新实例(即按值返回)。
非成员函数没有尾随const
修饰符,因为它们没有调用。参数应通过值或常量引用传递,具体取决于类的内容:
friend Mystery operator+ (Mystery, Mystery);
friend Mystery operator+ (Mystery const &, Mystery const &);
friend
关键字仅在类内部声明时显示,以授予函数对其私有成员的访问权限。在类之外(例如在定义中),它只是:
Mystery operator+ (Mystery, Mystery);
Mystery operator+ (Mystery const &, Mystery const &);
案例 (1) 错误:预期的是 idenifier 运算符
您缺少第 3 行上的关键字operator
bool Mystery::operator<=(const Mystery& rightObj) //Line 3
{
...
}
案例 (2)错误:关系运算符的参数过多
作为成员函数重载的关系运算符应只有一个参数
bool operator <= (const Mystery&); //Line 2
案例 (3)
缺少显式返回类型
friend Mystery operator+ (const Mystery&); //Line 2
其他吹毛求疵
- 如果函数不应该改变参数,请将其设为常量引用。
bool operator <= (Mystery);
右侧对象应该是常量引用。
bool Mystery::<=(Mystery rightObj)
语法错误,应为:bool Mystery::operator <=(const Mystery& rightObj)
bool operator <= (Mystery, Mystery);
运算符仅使用一个参数 - 错误
friend operator+ (Mystery);
尝试让全局运算符+朋友,应该使用全局范围"::"。全局操作员需要 2 个输入,而不是一个。使用常量引用。运算符还应返回对"this"的引用。
Mystery& operator+(const Mystery& lhs, const Mystery& rhs);
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了