Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中定义加法运算符的正确方法+; 我想知道C++中的代码< >运算符+的正确方法(假设我定义了一个类由代码< C>代码>定义的对象的加法运算符)?p>_C++_Operators - Fatal编程技术网

在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); }