运算符重载说明
Operator overloading explanation
我正在尝试理解使用运算符重载的短程序的输出。
输出为 137,其中(2+v).print()
输出13和7来自v.print();
#include <iostream>
using namespace std;
class V
{
int x;
public:
V(int a = 7, int b = 3) { x = a + b; }
void print() { cout << x; }
V operator+(int n)
{
return x++ + ++n;
}
};
V operator+(int lop, V rop)
{
return rop + lop;
}
int main()
{
V v(1, 6);
(2 + v).print();
v.print();
return 0;
}
我了解运算符重载的基本概念,我得到V rop
只是V v(1,6)
的副本,它不会改变x
保持 7 的v.print();
的输出,但我不明白为什么它输出 13,我总是得到 10。
问题是当尝试从此运算符返回类型为"V"的对象时:
V operator+(int n)
{
return x++ + ++n;
}
您尝试在"int"中返回的内容,因此它应该强制转换为类型"V"的对象,其完成方式(从基元类型转换为自定义类(是使用构造函数。您拥有的唯一构造函数是具有 2 个可选参数,这会产生它尝试仅创建一个参数的对象的问题,因此它以 a = 10、b = 3(默认值(的形式发送,然后输出为 13。
如果您不想更改类的成员,我建议使用多个构造函数来解决问题。
class V
{
int x;
public:
V() { x = 10; }
V(int a) { x = a; }
V(int a, int b) { x = a + b; }
void print() { cout << x; }
V operator+(int n)
{
return x++ + ++n;
}
};
通过这种方式,您可以调用一个默认构造函数,该构造函数像以前一样将 x 设置为 10,另一个具有 1 个参数的构造函数从 'int' 转换为 'V',以及采用 a 和 b 的普通构造函数。
在到达编译器return (x++ + ++n);
code
创建一个对象V
以便再次调用构造函数。 然后这些分配将发生a=10
和b=3
.所以你必须保存a
并在另一个members
中b
值。
试试这个:
#include <iostream>
using namespace std;
class V {
int x;
int a;
int b;
public:
V(int a=7, int b=3) { x = a + b; this->a = a; this->b = b; }
void print() { cout << x - this->b; }
V operator+(int n) {
return (x++ + ++n);
}
};
V operator+(int lop, V rop) {
return rop + lop;
}
int main()
{
V v(1,6);
(2 + v).print();
v.print();
return 0;
}
您的(2 + v).print();
输出将10
。
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 运算符重载说明
- 分数类增量运算符重载说明
- 关于操作符重载的具体说明
- 运算符重载语法说明
- 关于智能指针运算符*和运算符>重载的说明
- C++运算符重载说明
- C++重载<<或>>示例和说明