c++ - 赋值运算符重载

标签 c++ oop operator-overloading

我试图重载赋值运算符。给定

Point p1(1,2,3);
Point p2(1,2,3);
Point p3 = p1 + p2;
Point p4 = 22;
cout<< p4;

这是我的完整代码:

#include<iostream>
#include <bits/stdc++.h>


using namespace std;

class Point{
private:
    int m_x, m_y, m_z;
public:
    Point(int x=0, int y = 0, int z = 0):m_x(x), m_y(y), m_z(z)
    {
    }
    friend Point operator+(Point &p1, Point &p2);
    friend ostream& operator<<(ostream &out, Point &p);
    Point operator=(int val);

};

Point operator+(Point &p1, Point &p2){
    return Point(p1.m_x+p2.m_x , p1.m_y+ p2.m_y , p1.m_z+p2.m_z);
}

ostream& operator<<(ostream &out, Point &p){
    out<<"output: "<<p.m_x<<" "<<p.m_y<<" "<< p.m_z<<'\n';
    return out;
}
Point Point::operator=(int val){
    return Point(val, val, val);
}

int main(){
Point p1(1,2,3);
Point p2(1,2,3);
Point p3 = p1 + p2;
Point p4 = 22;
cout<< p4;

}

我无法在 m_x、m_y、m_z 中插入值 22 或任何值。我该如何解决这条线:

Point p4 = 22;

最佳答案

这里有 2 个不同的问题。

Point p4 = 22;

这不是赋值,实际上是对构造函数的调用。由于您声明的构造函数采用 3 个具有默认值的 int,因此可以使用 1、2 或 3 个值调用它。

所以这相当于做这两个中的任何一个

Point p4(22, 0, 0);
Point p4(22);

如果你想使用你需要写的赋值运算符

Point p4;
p4 = 22;

但在这里我们遇到了第二个问题,您的赋值运算符创建了一个新的 Point 并按值返回它。您要做的是修改现有的。

Point& Point::operator=(int val){ // Return by reference
    m_x = m_y = m_z = val;
    return *this;
}

关于c++ - 赋值运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54803142/

相关文章:

operator-overloading - 如何为不同的 RHS 类型和返回值重载运算符?

C++ 未找到 << 运算符,它采用右手操作数

c++ - 在 COM 自动化中 #import tlb 文件时出现编译错误

c++ - 将 cv::Mat 转换为 Magick::Image

c++ - QWidget继承自自定义QWidget

c++ - 重载矩阵乘法 "* "运算符有问题

javascript - 如何创建一个可以在我的 JS 文件之外访问的全局 javascript 对象?

php - 如何在 PHP 中创建一个成功的域对象工厂

c++ - 当我按值而不是按引用返回时,为什么不能调用运算符?

c++ - 我们如何从 boost::asio::tcp::ip::read_some 调用中顺序接收多个数据?