服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++中操作符的前置与后置有什么区别

C++中操作符的前置与后置有什么区别

2022-12-13 14:16清风自在 流水潺潺 C/C++

C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。接下了让我们详细了解掌握它

一、值得思考的问题

下面的代码有没有区别?为什么?

C++中操作符的前置与后置有什么区别

 

二、意想不到的事实

  • 现代编译器产品会对代码进行优化
  • 优化使得最终的二进制程序更加高效
  • 优化后的二进制程序丢失了 C/C++ 的原生语义
  • 不可能从编译后的二进制程序还原 C/C++ 程序

 

三、++ 操作符重载

++ 操作符可以重载吗?如何区分前置++ 和后置++?

++ 操作符可以被重载

  • 全局函数和成员函数均可进行重载
  • 重载前置++操作符不需要额外的参数
  • 重载后置++操作符需要一个 int 类型的占位参数

下面来看 ++ 操作符重载的示例:

#include <iostream>
using namespace std;
class Test
{
  int mValue;
public:
  Test(int i)
  {
      mValue = i;
  }
  int value()
  {
      return mValue;
  }
  Test& operator ++ ()
  {
      ++mValue;
      return *this;
  }
  Test operator ++ (int)
  {
      Test ret(mValue);
      mValue++;
      return ret;
  }
};
int main()
{
  Test t(0);
  Test m(0);
  Test tt = t++;
  cout << "tt = " << tt.value() << endl;
  cout << "t = " << t.value() << endl;
  Test mm = ++m;
  cout << "mm = " << mm.value() << endl;
  cout << "m = " << m.value() << endl;
  return 0;
}

输出结果如下:

C++中操作符的前置与后置有什么区别

前置++的效率高于后置++,因为前置的++没有生成额外的对象,意味着不需要过多的内存,也就是不需要在栈上生成对象。而后置的++需要创建栈空间上的对象,占用栈空间,并且需要调用构造函数,返回后需要调用析构函数。

 

四、真正的区别

对于基础类型的变量

  • 前置++的效率与后置++的效率基本相同
  • 根据项目组编码规范进行选择

对于类类型的对象

  • 前置++的效率高于后置++
  • 尽量使用前置++操作符提高程序效率

前面写过的复数类可以进一步完善了:

Complex.h:

#ifndef _COMPLEX_H_
#define _COMPLEX_H_
class Complex
{
  double a;
  double b;
public:
  Complex(double a = 0, double b = 0);
  double getA();
  double getB();
  double getModulus();
  Complex operator + (const Complex& c);
  Complex operator - (const Complex& c);
  Complex operator * (const Complex& c);
  Complex operator / (const Complex& c);
  bool operator == (const Complex& c);
  bool operator != (const Complex& c);
  Complex& operator = (const Complex& c);
  Complex& operator ++ ();
  Complex operator ++ (int);
};
#endif

Complex.cpp:

#include "Complex.h"
#include "math.h"
Complex::Complex(double a, double b)
{
  this->a = a;
  this->b = b;
}
double Complex::getA()
{
  return a;
}
double Complex::getB()
{
  return b;
}
double Complex::getModulus()
{
  return sqrt(a * a + b * b);
}
Complex Complex::operator + (const Complex& c)
{
  double na = a + c.a;
  double nb = b + c.b;
  Complex ret(na, nb);
  return ret;
}
Complex Complex::operator - (const Complex& c)
{
  double na = a - c.a;
  double nb = b - c.b;
  Complex ret(na, nb);
  return ret;
}
Complex Complex::operator * (const Complex& c)
{
  double na = a * c.a - b * c.b;
  double nb = a * c.b + b * c.a;
  Complex ret(na, nb);
  return ret;
}
Complex Complex::operator / (const Complex& c)
{
  double cm = c.a * c.a + c.b * c.b;
  double na = (a * c.a + b * c.b) / cm;
  double nb = (b * c.a - a * c.b) / cm;
  Complex ret(na, nb);
  return ret;
}
bool Complex::operator == (const Complex& c)
{
  return (a == c.a) && (b == c.b);
}
bool Complex::operator != (const Complex& c)
{
  return !(*this == c);
}
Complex& Complex::operator = (const Complex& c)
{
  if( this != &c )
  {
      a = c.a;
      b = c.b;
  }
  return *this;
}
Complex& Complex::operator ++ ()
{
  a = a + 1;
  b = b + 1;
  return *this;
}
Complex Complex::operator ++ (int)
{
  Complex ret(a, b);
  a = a + 1;
  b = b + 1;
  return ret;
}

test.cpp:

#include <iostream>
#include "Complex.h"
using namespace std;
int main()
{
  Complex a(0, 0);
  Complex b(0, 0);
  Complex aa = a++;
  Complex bb = ++b;
  cout << "aa的实部为: " << aa.getA() << endl;
  cout << "aa的实部为: " << aa.getB() << endl;
  cout << "bb的实部为: " << bb.getA() << endl;
  cout << "bb的实部为: " << bb.getB() << endl;
  return 0;
}

输出结果如下:

C++中操作符的前置与后置有什么区别

 

五、小结

  • 编译优化使得最终的可执行程序更加高效
  • 前置++操作符和后置++操作符都可以被重载
  • ++操作符的重载必须符合其原生语义
  • 对于基础类型,前置++与后置++的效率几乎相同
  • 对于类类型,前置++的效率高于后置++

到此这篇关于C++中操作符的前置与后置有什么区别的文章就介绍到这了,更多相关C++操作符内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/124550918

延伸 · 阅读

精彩推荐
  • C/C++C++ 中malloc()和free()函数的理解

    C++ 中malloc()和free()函数的理解

    这篇文章主要介绍了C++ 中malloc()和free()函数的理解的相关资料,这里提供用法示例帮助大家理解这部分知识,需要的朋友可以参考下...

    小小白杨1237822021-05-27
  • C/C++C语言实现扫雷经典游戏

    C语言实现扫雷经典游戏

    这篇文章主要为大家详细介绍了C语言实现扫雷经典游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    仓笙5912021-12-08
  • C/C++解析c中stdout与stderr容易忽视的一些细节

    解析c中stdout与stderr容易忽视的一些细节

    本篇文章是对在c语言中stdout与stderr容易忽视的一些细节进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网2822020-12-09
  • C/C++OpenCV实现可分离滤波

    OpenCV实现可分离滤波

    这篇文章主要为大家详细介绍了OpenCV实现可分离滤波,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    我有一個夢想6122021-11-17
  • C/C++使用udp发送>=128K的消息会报ENOBUFS的错误的解决方法

    使用udp发送>=128K的消息会报ENOBUFS的错误的解决方法

    在项目中选择了unix域的数据报套接口。在使用过程中碰到了如下,问题:发送<128K的消息时,客户、进程可以正常收发消息;发送>=128K的消息时,发送端...

    吴秦12282021-07-29
  • C/C++C++运算符重载规则详解

    C++运算符重载规则详解

    这篇文章主要介绍了C++运算符重载规则详解,是C++入门学习中的基础知识,需要的朋友可以参考下...

    C++教程网10002021-03-14
  • C/C++C/C++中数据类型转换详解及其作用介绍

    C/C++中数据类型转换详解及其作用介绍

    这篇文章主要介绍了C/C++中数据类型转换详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    我是小白呀5372021-12-28
  • C/C++C++实现彩色飞机大战

    C++实现彩色飞机大战

    这篇文章主要为大家详细介绍了C++实现彩色飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    研究猿小刘9162021-09-30