C++:运算符重载问题?
C++: Operator Overloading Problems?
我的朋友有一些关于运算符重载的代码。代码如下:
class Bar
{
public:
int num;
Bar(int n){
num = n;
}
};
class FooPa
{
// Consider it empty
};
class Foo : public FooPa
{
Bar *b1, *b2;
Bar operator + ( )// **I don't understand this function, how can I use it?**
{
int value= b1->num +b2->num;
Bar * b = new Bar(value);
return (*b);
}
};
我不明白函数 "Bar operator +()"。他想数学添加 "b1.num" 和 "b2.num",然后 return 一个新对象。是否有意义?我如何使用这个新运算符“+”,谁能举个例子?
原型Bar Foo ::operator +()
表示一元加运算符。可以这样使用:
Foo f;
Bar b = +f; // "+f" is the unary plus operator
I don't understand the function Bar operator +()
"
理所当然。它没有多大意义(当然,对于像 "Foo" 和 "Bar" 这样的示例名称,几乎没有什么意义)。它声明了一个 一元加运算符 .
这已经是该语言的一个非常奇特的特性了。这是一个例子:
#include <iostream>
int main()
{
int i = 5;
std::cout << +i << "\n";
}
不出所料,该程序将打印 5
。不过,它有 一些 用例。参见 What is the purpose of unary plus operator on char array? and What does the unary plus operator do?。
在您的代码中,您可以这样调用运算符:
Foo f;
+f;
关于您显示的代码的另一个奇怪之处是运算符 returns Bar
而不是人们期望的 Foo
(尽管同样,名称如 "Foo" 和 "Bar",人们无法真正确定代码的假定意图)。
运算符也是private
,也就是说只能在Foo
自己的函数或者朋友里面使用。这不可能是对的。
int value= b1->num +b2->num;
这是未定义的行为,因为您试图通过未初始化的指针访问成员[*]。或者您没有向我们展示 b1
和 b2
被初始化 and/or 分配的代码。
Bar * b = new Bar(value);
return (*b);
这会造成内存泄漏,因为 new
动态分配的内存中的 Bar
对象被复制并且永远不会被销毁,作为唯一指向它的指针 (b
) 丢失了。
也许您的朋友想创造将 Bar
和 Foo
相加的可能性。如果是这样的话,那么很多事情都出了问题。该函数有错误的接口 和 错误的实现。
请转至 http://en.cppreference.com/w/cpp/language/operators 并阅读有关二进制算术运算符的部分,了解如何正确完成此操作。
或者暂时忘记运算符重载。似乎缺少有关该语言的一些更基本的知识(例如 nullptr
/ 指针初始化 / 一般指针)。
[*] 不是 nullptr
,因为这个答案的前一个版本说
通常运算符重载意味着您正在为现有运算符赋予新定义。有一些例外和规则需要遵守(google)。
基本语法是
<return type> operator "symbol" (parameters)
例如:假设您有一个像这样的 class 复合体
class complex{
int real,img;
}
您需要重载运算符 +,使其能够像这样执行两个复数的加法
public:
void operator+(complex ob)
{cout<<real+ob.real<<" + i "<<img+ob.img; }
规则:
运算符必须与这样的 class 对象一起使用
complex a,b;
a+b;
注意:
这里 a 是调用对象( ((a.)+b)) 这由编译器处理)。 b 与 a 没有任何关系,除了它们具有相同的数据类型这一事实。所以 b 作为参数传递(所有二元运算符都必须有一个参数)。
对于您的示例,您已经重载了一元 + 运算符。它与二进制重载基本相同,但不能传递参数。
希望你理解运算符重载的概念
我的朋友有一些关于运算符重载的代码。代码如下:
class Bar
{
public:
int num;
Bar(int n){
num = n;
}
};
class FooPa
{
// Consider it empty
};
class Foo : public FooPa
{
Bar *b1, *b2;
Bar operator + ( )// **I don't understand this function, how can I use it?**
{
int value= b1->num +b2->num;
Bar * b = new Bar(value);
return (*b);
}
};
我不明白函数 "Bar operator +()"。他想数学添加 "b1.num" 和 "b2.num",然后 return 一个新对象。是否有意义?我如何使用这个新运算符“+”,谁能举个例子?
原型Bar Foo ::operator +()
表示一元加运算符。可以这样使用:
Foo f;
Bar b = +f; // "+f" is the unary plus operator
I don't understand the function
Bar operator +()
"
理所当然。它没有多大意义(当然,对于像 "Foo" 和 "Bar" 这样的示例名称,几乎没有什么意义)。它声明了一个 一元加运算符 .
这已经是该语言的一个非常奇特的特性了。这是一个例子:
#include <iostream>
int main()
{
int i = 5;
std::cout << +i << "\n";
}
不出所料,该程序将打印 5
。不过,它有 一些 用例。参见 What is the purpose of unary plus operator on char array? and What does the unary plus operator do?。
在您的代码中,您可以这样调用运算符:
Foo f;
+f;
关于您显示的代码的另一个奇怪之处是运算符 returns Bar
而不是人们期望的 Foo
(尽管同样,名称如 "Foo" 和 "Bar",人们无法真正确定代码的假定意图)。
运算符也是private
,也就是说只能在Foo
自己的函数或者朋友里面使用。这不可能是对的。
int value= b1->num +b2->num;
这是未定义的行为,因为您试图通过未初始化的指针访问成员[*]。或者您没有向我们展示 b1
和 b2
被初始化 and/or 分配的代码。
Bar * b = new Bar(value); return (*b);
这会造成内存泄漏,因为 new
动态分配的内存中的 Bar
对象被复制并且永远不会被销毁,作为唯一指向它的指针 (b
) 丢失了。
也许您的朋友想创造将 Bar
和 Foo
相加的可能性。如果是这样的话,那么很多事情都出了问题。该函数有错误的接口 和 错误的实现。
请转至 http://en.cppreference.com/w/cpp/language/operators 并阅读有关二进制算术运算符的部分,了解如何正确完成此操作。
或者暂时忘记运算符重载。似乎缺少有关该语言的一些更基本的知识(例如 nullptr
/ 指针初始化 / 一般指针)。
[*] 不是 nullptr
,因为这个答案的前一个版本说
通常运算符重载意味着您正在为现有运算符赋予新定义。有一些例外和规则需要遵守(google)。
基本语法是
<return type> operator "symbol" (parameters)
例如:假设您有一个像这样的 class 复合体
class complex{
int real,img;
}
您需要重载运算符 +,使其能够像这样执行两个复数的加法
public:
void operator+(complex ob)
{cout<<real+ob.real<<" + i "<<img+ob.img; }
规则: 运算符必须与这样的 class 对象一起使用
complex a,b;
a+b;
注意: 这里 a 是调用对象( ((a.)+b)) 这由编译器处理)。 b 与 a 没有任何关系,除了它们具有相同的数据类型这一事实。所以 b 作为参数传递(所有二元运算符都必须有一个参数)。
对于您的示例,您已经重载了一元 + 运算符。它与二进制重载基本相同,但不能传递参数。 希望你理解运算符重载的概念