在C+中定义加法运算符的正确方法+; 我想知道C++中的代码< >运算符+的正确方法(假设我定义了一个类由代码< C>代码>定义的对象的加法运算符)?p>
或在C+中定义加法运算符的正确方法+; 我想知道C++中的代码< >运算符+的正确方法(假设我定义了一个类由代码< C>代码>定义的对象的加法运算符)?p>,c++,operators,C++,Operators,或 通常,您应该更喜欢const引用版本,因为您已经保证不会更改引用的对象,并且它避免调用复制构造函数。除此之外,除非在操作符+()中执行某些不安全的操作,否则两者之间应该没有太大区别(比如获取传递对象或其成员的地址,对对象生命周期做出不满意的假设,或者复制构造函数实现有缺陷) 根据类c的语义,复制构造函数也可能有一些不希望的副作用,但这只有作为c类的作者才能知道 此外,根据您在运算符+()中执行的操作以及编译器可以直接看到的类c的代码,编译器可能会优化按值传递的情况,从而使生成的机器代码相同。
通常,您应该更喜欢const引用版本,因为您已经保证不会更改引用的对象,并且它避免调用复制构造函数。除此之外,除非在操作符+()中执行某些不安全的操作,否则两者之间应该没有太大区别(比如获取传递对象或其成员的地址,对对象生命周期做出不满意的假设,或者复制构造函数实现有缺陷) 根据类
c
的语义,复制构造函数也可能有一些不希望的副作用,但这只有作为c
类的作者才能知道
此外,根据您在运算符+()中执行的操作以及编译器可以直接看到的类
c
的代码,编译器可能会优化按值传递的情况,从而使生成的机器代码相同。通常,您应该更喜欢const引用版本,因为您已经保证不会更改引用的对象,并且它可以避免调用复制构造函数。除此之外,除非在操作符+()中执行某些不安全的操作,否则两者之间应该没有太大区别(比如获取传递对象或其成员的地址,对对象生命周期做出不满意的假设,或者复制构造函数实现有缺陷)
根据类c
的语义,复制构造函数也可能有一些不希望的副作用,但这只有作为c
类的作者才能知道
此外,根据您在运算符+()中执行的操作以及编译器可以直接看到的类
c
的代码,编译器可能会优化按值传递的情况,从而使生成的机器代码相同。通常,您应该更喜欢const引用版本,因为您已经保证不会更改引用的对象,并且它可以避免调用复制构造函数。除此之外,除非在操作符+()中执行某些不安全的操作,否则两者之间应该没有太大区别(比如获取传递对象或其成员的地址,对对象生命周期做出不满意的假设,或者复制构造函数实现有缺陷)
根据类c
的语义,复制构造函数也可能有一些不希望的副作用,但这只有作为c
类的作者才能知道
此外,根据您在运算符+()中执行的操作以及编译器可以直接看到的类
c
的代码,编译器可能会优化按值传递的情况,从而使生成的机器代码相同。通常,您应该更喜欢const引用版本,因为您已经保证不会更改引用的对象,并且它可以避免调用复制构造函数。除此之外,除非在操作符+()中执行某些不安全的操作,否则两者之间应该没有太大区别(比如获取传递对象或其成员的地址,对对象生命周期做出不满意的假设,或者复制构造函数实现有缺陷)
根据类c
的语义,复制构造函数也可能有一些不希望的副作用,但这只有作为c
类的作者才能知道
此外,根据您在运算符+()中执行的操作以及编译器可以直接看到的类
c
的代码,编译器有可能会优化传递值的情况,从而使生成的机器代码相同。定义操作的推荐方法+
(和其他类似操作,如-
等)是定义+=
运算符,然后根据+=
定义+
。运算符+=
应该是类的公共成员,应该通过常量引用接受一个参数,并且应该返回对该参数的引用:
c& operator+=(const c& other)
{
... // modify the object in appropriate way, e.g. if it has a member x do
... // x += other.x;
return *this;
}
然后很容易定义运算符+
。它应该是类外定义的全局函数:
c operator+(const c& lhs, const c& rhs)
{
c that = lhs;
that += rhs;
return that;
}
当然,可以用其他方式定义这些运算符,通常其他方式可能更好,但这样做应该有一些理由。否则,最好坚持使用此默认值。定义操作的推荐方式
+
(以及其他类似操作,如-
等)是定义+=
运算符,然后根据+=
定义+
。运算符+=
应该是类的公共成员,应该通过常量引用接受一个参数,并且应该返回对此的引用:
c& operator+=(const c& other)
{
... // modify the object in appropriate way, e.g. if it has a member x do
... // x += other.x;
return *this;
}
然后很容易定义运算符+
。它应该是类外定义的全局函数:
c operator+(const c& lhs, const c& rhs)
{
c that = lhs;
that += rhs;
return that;
}
当然,可以用其他方式定义这些运算符,通常其他方式可能更好,但这样做应该有一些理由。否则,最好坚持使用此默认值。定义操作的推荐方式
+
(以及其他类似操作,如-
等)是定义+=
运算符,然后根据+=
定义+
。运算符+=
应该是类的公共成员,应该通过常量引用接受一个参数,并且应该返回对此的引用:
c& operator+=(const c& other)
{
... // modify the object in appropriate way, e.g. if it has a member x do
... // x += other.x;
return *this;
}
然后很容易定义运算符+
。它应该是类外定义的全局函数:
c operator+(const c& lhs, const c& rhs)
{
c that = lhs;
that += rhs;
return that;
}
c的
Int operator+(Int const & rhs)
{ Int result(*this); result += rhs; return result; }
Int operator+(Int && rhs)
{ Int result(*this); result += std::move(rhs); return result; }
Int operator+(Int rhs) & { return rhs += *this; }
Int operator+(Int rhs) && { return rhs += std::move(*this); }