C++ 重载运算符作为复制构造函数的参数

C++ 重载运算符作为复制构造函数的参数,c++,C++,我想对重载的运算符*的结果使用复制构造函数。我找到了这样做的方法:从操作符返回引用。我想知道的是: 这样行吗 以下是一个例子: class Foo{ public: double x,y,z; Foo() : x(0), y(0), z(0) {}; Foo(double xi, double yi, double zi) : x(xi), y(yi), z(zi) {}; Foo(const Foo &bar) :

我想对重载的
运算符*
的结果使用复制构造函数。我找到了这样做的方法:从操作符返回引用。我想知道的是:

  • 这样行吗 以下是一个例子:

    class Foo{
        public:
            double x,y,z;
            Foo() : x(0), y(0), z(0) {};
            Foo(double xi, double yi, double zi) : x(xi), y(yi), z(zi) {};
            Foo(const Foo &bar) : x(bar.x), y(bar.y), z(bar.z) {};
    };
    
    Foo& operator * (const double &b, Foo &a){ // Yep, I want to modify a
        a.x *= b;
        a.y *= b;
        a.z *= b;
        return a;
    }
    
    int main(){
        Foo temp;
        Foo bar = 4*temp; // Here is what I want to do!
    
        return 0;
    }
    
    我想

    const Foo operator *(const double& b, Foo& a)
    {
        a.x *= b;
        a.y *= b;
        a.z *= b;
    
         return a;
    }
    
    如果您真的想修改
    a
    ,可能就是您想要的。我个人会放弃推荐信。返回类型上的
    const
    是确保以下内容所必需的:

    Foo a, c;
    double b = 1.0;
    
    (a * b) = c;
    
    不合法

    你的方法不是做事的标准方法。通常,您将有:

    const Foo operator *(const double& b, const Foo& a)
    {
        return Foo(a.x *b, a.y * b, a.z * b);
    }
    
    一种标准的可交换乘法,其中操作数保持不变

    1这样可以吗

    它的结构很好,行为也很明确。然而,这是非常非常规的,因为二进制算术运算符通常不修改其操作数。这将使代码的用户非常困惑

    与通常定义二进制算术运算符的方法相比,您的方法也更具局限性:

    Foo get_foo();         // for exposition
    Foo bar = 4*get_foo(); // oops, this doesn't work
    
    考虑到非常规性、已证明的局限性以及与传统方法相比缺乏益处,我认为这是不好的

    2标准运营商是否使用类似的方法?例如:

    int b = 4*4;
    
    没有。没有一个内置的二进制算术运算符是这样工作的。标准库中的重载也没有一个是这样的(我没有检查,但我有信心)


    我建议使用通常的方法,尤其是考虑到这是针对3d向量的:

    A operator*(const B& lhs, const A& rhs);
    
    操作数是常量引用,因此它们不会被修改,结果是一个可用于初始化变量的新实例



    另外,您的自定义复制构造函数与隐式复制构造函数的作用相同,因此它似乎是多余的。

    对于
    运算符*
    ,我们希望:

    • 两个输入保持不变
    • 要返回的新对象(按值)
    这给了我们以下签名:

    Foo operator * (double a, Foo const & b);
    
    如果要修改
    temp
    =
    4*temp
    ,请使用
    operator*=
    作为
    temp*=4,它修改
    temp
    并返回其引用:

    Foo & operator *= (Foo & a, double b) {
        a.x *= b;
        a.y *= b;
        a.z *= b;
        return a;
    }
    


    intb=4*4,您是否希望第二个
    4
    变为16?这就是您的操作员所做的。为什么您不能从它返回一个普通的
    Foo
    ?我不明白为什么它不起作用。为什么您的操作员会修改传递给它的
    Foo
    ,而不是创建并返回临时文件?@O'Neil Yep,您是对的。这是不同的事情。但我希望在我的示例Implemental
    operator*=
    中修改它。为什么需要返回引用?谢谢您的回复!我只是想说清楚。我正在实现3D矢量,所以每次键入“vector*3;”向量应该被修改。当你有
    int
    s并且你写
    inta=3*b
    时,
    b
    不会被修改。您想要的值现在位于
    a
    中。在这里,如果你想让它成为标准的方式,看起来是一样的。好的,如果你不需要它是标准的,我建议你编辑你的问题来移除它。所以对于你想要的方法来说,可以,减去引用(它是合法的C++并且做你想要的),但是我会给返回类型添加<代码> const <代码>。谢谢你的回复!我应该在Begging上写:我正在实现3D矢量,所以每次我输入'vector*3;'向量应该被修改。@Constructovec为什么你认为
    vector
    应该被那个表达式修改?这不是程序员所期望的3d向量的行为。我建议
    vector
    不应被该表达式修改。但还会发生什么呢?我的意思是,向量与数字相乘还能做什么?@Constructovec“还能发生什么”->函数可以返回相乘的结果。这就是内置操作符的工作方式,也是标准库中所有重载的工作方式。“向量与数字相乘还能做什么?”->我不理解你的问题。@C直觉上,我会说几何向量与数字相乘的结果将是一个新的几何向量,其每个维度是向量操作数和数字操作数的相应维度的乘积。是的,我们通常会例外。但这里我要处理的是向量,这个运算对向量有不同的效果,比如整数。很抱歉,我的问题不清楚,无法确定这一时刻。@Constructovec无论类型是什么,我们都希望出现这种行为。Vector包含在内。对不起,我的英语非常好:)我编辑了我的问题。所以当我编写一些程序时,最好使我的程序的行为尽可能类似于普遍接受的(类似程序的)行为?你说我的操作员的行为是出乎意料的。我想知道:让一切都变得传统(可以期待)更好吗?