0

在这些 c++ 示例中:

 1. int operator+ ( Jazz &lhs,Jazz &rhs );

 2. Jazz & Jazz operator= (const Jazz &);

 3. Jazz & operator+ ( const Jazz & )

我了解 C++ 中运算符重载背后的基本概念。我不知道的是:

在第二个例子中,我们需要在重载operator=之前声明和定义复制构造函数吗?

如何区分成员和非成员运算符重载?

第一个示例是非成员,但它可以访问类实例并与它们一起使用?

第三个例子也是非成员,但它是 Jazz 类型的?

有人可以解释一下吗。谢谢你。

4

2 回答 2

2

示例一必须是非成员运算符。因为operator+如果是非成员,则有一个或两个参数,但如果是成员,则有零或一个。它没有特殊Jazz的访问权限,在这方面它与任何其他功能相同。如果你想给它特殊的访问权限,Jazz你可以将它声明为 a friend(再次就像任何其他函数一样)。

示例二必须是成员,这只是C++的规则,operator=必须是成员函数。您也不必声明复制构造函数。只是如果您需要一个复制构造函数,您还需要一个赋值运算符,反之亦然,这是很常见的。

示例三可以是成员或非成员(见答案 1)。如果它是一个成员,它将定义一个二元运算符(即用于 like 的用途a + b),但如果它是一个非成员,它将定义一个一元运算符(即用于 like 的用途+a)。不管怎样,我认为说它是“爵士类型”是不对的。它可以是 Jazz 类的成员,但不一定是,它可以是完全不同类的成员。

于 2013-08-31T10:31:51.400 回答
0

如何区分成员和非成员运算符重载?

成员和非成员运算符重载之间的一个区别是,对于声明/定义为成员函数的重载,参数的数量减少了一个。对于一元运算符,您没有参数,对于二元运算符,您有一个。

有一些重载不能在类范围之外声明/定义,operator=() 就是其中之一。

此外,成员函数的作用域不同,如果没有声明类型的实例,就不能调用,除非它是静态的。某些必须是成员函数的运算符,例如 operator=(),但不允许是静态的。

第一个示例是非成员,但它可以访问类实例并与它们一起使用?

operator+() 是带有两个参数的二元运算符表示一个自由函数。

如果该类型定义了一个允许 operator+() 在两个实例上工作的公共接口。或者,如果运算符被声明为友元函数,则授予该函数访问该类型的私有成员和受保护成员的权限。

在您上面的示例中,返回类型非常“有趣”,因为两个 Jazz 实例的总和显然应该是一个 int。您可能想对此提出质疑。

第三个例子也是非成员,但它是 Jazz 类型的?

该运算符通常称为复制赋值运算符,并且如上所述,它必须是某种类型 T 的非静态成员函数。

该标准不强制要求返回类型,它可能只是void,但约定返回一个非常量引用给受让人,即被分配给的类型 T 的实例。

T& T::operator(const T& rhs)

返回 ref 的原因之一是可以进行赋值链接:

T t;
T t2;
T t3;
t = t2 = t3; // assignment chaining

另一个原因是,在某些情况下,标准库期望 operator=() 返回对用户定义类型的受让人的引用。

有关 C 和 C++ 中相当完整的运算符列表,您可以参考

于 2013-08-31T10:57:18.543 回答