操作符重载问题
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"answers"b2"。Num",然后返回一个新对象。这有意义吗?我如何使用这个新的运算符"+",有人可以给一个例子吗?
原型Bar Foo ::operator +()
表示一元加号运算符。它可以这样使用:
Foo f;
Bar b = +f; // "+f" is the unary plus operator
操作符重载通常意味着给现有的操作符赋予新的定义。有一些例外和规则需要遵循(谷歌它)。
基本语法是 <return type> operator "symbol" (parameters)
例如:假设你有一个像这样的复杂类
class complex{
int real,img;
}
您需要重载操作符+,使其能够执行像这样的两个复数的加法
public:
void operator+(complex ob)
{cout<<real+ob.real<<" + i "<<img+ob.img; }
规则:操作符必须与类对象一起使用,如
complex a,b;
a+b;
注意:这里a是调用对象(((a.)+b))这是由编译器处理的)。除了B和a具有相同的数据类型外,它们没有任何联系。因此b作为形参传递(所有二进制操作符都必须有实参)。
在你的例子中,你重载了一元+运算符。它基本上和二进制重载是一样的,但是你不能传递参数。希望您理解操作符重载的概念我不理解
Bar operator +()
"的功能
理应如此。它没有多大意义(当然,对于像"Foo"answers"Bar"这样的示例名称,很少有东西有意义)。它声明了一个一元加运算符。
这已经是该语言的一个外来特征了。下面是一个例子:
#include <iostream>
int main()
{
int i = 5;
std::cout << +i << "n";
}
不出所料,这个程序将打印5
。但是有一些用例。参见char数组上的一元加号操作符的目的是什么?和一元加号操作符做什么?
Foo f;
+f;
关于您所显示的代码的另一个奇怪的事情是,操作符返回Bar
而不是像人们期望的那样返回Foo
(尽管,再次使用像"Foo"answers"Bar"这样的名称,人们无法真正确定代码的假定意图)。
操作符也是private
,这意味着它只能在Foo
自己的函数或友元中使用。这不可能是对的。
int value= b1->num +b2->num;
这是未定义的行为,因为您试图通过未初始化的指针[*]访问成员。或者你没有向我们展示b1
和b2
被初始化和/或赋值的代码。
Bar * b = new Bar(value); return (*b);
这会造成内存泄漏,因为Bar
对象在由new
动态分配的内存中被复制,并且永远不会被销毁,因为指向它的唯一指针(b
)丢失了。
也许你的朋友想创建添加Bar
和Foo
在一起的可能性。如果是这样的话,那么很多事情都出了问题。函数有错误的接口和错误的实现。
请访问http://en.cppreference.com/w/cpp/language/operators并阅读有关二进制算术运算符的部分,以了解如何正确地完成。
或者暂时忘记操作符重载。关于语言的一些更基本的知识(例如nullptr
/指针初始化/指针一般)似乎缺失了。
[*]not nullptr
s
- 一个关于在C++中重载布尔运算符的问题
- 在C++中使用重载提取运算符时出现问题
- 重载运算符与添加问题
- 加、乘、除、减复数的问题 C++ - 运算符重载
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 关于重载 -> 运算符中 const 关键字的特定位置的问题
- 基于 SFINAE 的特征实现问题与函数模板重载
- 关于在成员重载中使用 std::move() 的问题
- 字符 * 未从重载运算符或内存管理问题正确返回
- constexpr 运算符重载使用参数的问题
- c++中重载输入运算符的问题
- 在C++中写入 4D 矢量时遇到问题(没有可行的重载"=")
- 我的重载函数有什么问题?
- C++使用模板参数来解决重载问题
- C++ 中重载成员函数的问题
- 我想知道我将如何实现 + 运算符重载.我已经从我上一个问题中计算出 += 运算符重载
- 为什么C++在自定义结构向量时会出现 ostream 重载问题?
- 解决 CRTP 函数重载歧义问题
- C++:创建线程时出现问题;错误 C2672:"std::invoke":找不到匹配的重载函数
- C++重载构造函数问题