<C++>详解运算符重载之前置递增和后置递增

简介: <C++>详解运算符重载之前置递增和后置递增

递增运算符


       形如"a++""++a"。如果a初始值为1,那么"a++"结果为1,但是实际上a等于2,先读取再加1"++a"结果为2,实际也是2。这是对于基本运算类型,那么递增运算符重载的目的就是对于对象的属性也可以直接进行前置递增和后置递增。

       由于成员函数里重载写的内容少,就详细分析成员函数实现递增运算符重载


递增运算符重载的实现


类结构如下:


class Addoperator
{
private:
  int _Num;
public:
  Addoperator(int m)
  {
    _Num = m;
  }
};

         我的目的是直接输出类对象属性"A++",即cout<<A++<<endl;那么就需要先对左移运算符重载


左移运算符重载


示例:


//先对左移运算符重载
ostream& operator<<(ostream& cout, Addoperator A)
{
  cout << A._Num;
  return cout;
}
//需要在类第一行加上友元
friend ostream& operator<<(ostream& cout, Addoperator A);

       左移运算符重载在上篇博客以及详细介绍了,不理解的朋友可以去翻阅一下;由于_Num是私有属性 ,所以要在类内加上重载左移运算符函数是类友元的声明。


前置递增运算符重载


示例:


Addoperator& operator++()
  {
    _Num++;
    return *this;
  }

       函数名还是采取编译器提供的规范名operator++ ,返回值类型为类引用,这是链式调用的形式,这样可以实现多次的前置递增运算,例如:"++(++A)";由于是在成员函数,这里不需要参数直接进行属性的递增;返回值是*this,前面讲到过this是指向成员属性的指针,this可以调用对象的属性,那么*this就是对象本身,通过返回其引用可以链式调用重载的前置递增运算符,示例:


void test01()
{
  Addoperator A(1);
  cout <<++(++(++A)) << endl;
  cout << A << endl;
}


运行效果:


image.png


注意事项1a


       1、采用成员函数方法实现前置递增运算符重载不需要参数

       2、通过返回对象的引用可以链式调用,非常方便


后置递增运算符重载


示例:

Addoperator operator++(int)
  {
    Addoperator temp = *this;
    _Num++;
    return temp;
  }

       函数名也采用编译器提供的标准递增运算符,但是参数这里加了个int,这是函数进阶里提到的占位参数,可以只写一个数据类型放这儿,可以进行函数重载;很明显前置和后置递增重载的函数名相同,肯定需要进行函数重载的,而编译器就默认加上占位参数后为后置递增运算;由于后置递增是先读数据后操作,那么我就先创建一个对象来记录当前_Num的属性,然后进行递增,最后返回记录的对象属性即可;


调用:


void test02()
{
  Addoperator B(0);
  cout << B++<< endl;
  cout << B++<< endl;
  cout << B  << endl;
}


运行效果:


image.png


注意事项b


       1、虽然同时递增运算符重载,后置递增的运算却无法多次调用,不能链式调用,因为我们返回的引用是局部对象的引用,一旦返回,该对象地址就会被编译器清理,再调用的地址就会是新建的,因此这里最好不返回引用,直接返回值就行了,去掉"&"符号。

       2、后置的递增运算符重载需要传入一个占位参数,用来进行函数重载;此外,函数重载和函数的返回值类型无关,就算去掉"&"也会进行函数重载。

相关文章
|
4月前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
42 1
|
5月前
|
程序员 编译器 C++
C++中的运算符重载(Operator Overloading)
C++中的运算符重载(Operator Overloading)
52 1
|
1月前
|
C++
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
4月前
|
存储 编译器 C++
【C++】:拷贝构造函数和赋值运算符重载
【C++】:拷贝构造函数和赋值运算符重载
26 1
|
4月前
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
52 2
|
3月前
|
自然语言处理 程序员 C++
C++基础知识(五:运算符重载)
运算符重载是C++中的一项强大特性,它允许程序员为自定义类型(如类或结构体)重新定义标准运算符的行为,使得这些运算符能够适用于自定义类型的操作。这样做可以增强代码的可读性和表达力,使得代码更接近自然语言,同时保持了面向对象编程的封装性。
|
3月前
|
Java 程序员 C++
|
3月前
|
编译器 C++
【C++】详解运算符重载,赋值运算符重载,++运算符重载
【C++】详解运算符重载,赋值运算符重载,++运算符重载
|
4月前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。
|
4月前
|
C++
c++进阶篇(一)——运算符重载
c++进阶篇(一)——运算符重载