//一元运算符重载
#include<iostream>
using namespace std; class Point
{
public:
Point(int x,int y){
this->x = x;
this->y = y;
}
Point(Point &p){
this->x = p.x;
this->y = p.y;
cout << "拷贝构造函数被执行了1" << endl;
}
~Point(){
cout << "析构函数被执行了2" << endl;
}
//加法
friend Point operator+(Point p1, Point p2);
//前置++
friend Point& operator++(Point& pin);
//前置--
Point& operator--(){
this->x--;
this->y--;
return *this;
}
//后置++
friend Point operator++(Point& pin, int);
//后置--
Point operator--(int){
Point temp = *this;
this->x--;
this->y--;
return temp;
}
void PrintfA(){
cout << "x=" << this->x << endl;
cout << "y=" << this->y << endl; } private:
int x;
int y;
}; //+
Point operator+(Point p1, Point p2){
Point pres(p1.x + p2.x, p1.y + p2.y);
return pres;
} //前置++
Point& operator++(Point& pin){
pin.x++;
pin.y++;
//注明此处不存在pin的构造,析构 因为pin这个对象一直存在
return pin;
} //后置++
//Point & operator++(Point& pin, int)多了一个占位int类型参数表示是后置运算符
//这是c++的语法,这个占位参数只能是Int类型
Point operator++(Point& pin, int){
Point temp = pin;
//这里使用临时变量是为了保存后置++之前的状态
//因为后置++参加完运算后才会自增
pin.x++;
pin.y++;
return temp;
} void ProtectA(){
Point p1(, );
//前置++ (先自身++,在进行运算)
//全局函数 运算符重载
++p1;
//步骤1:首先承认运算符重载是一个函数
//operator++()
//步骤2:根据操作数,写出参数列表
//operator++(p1)
//步骤3:根据业务完成函数返回值,以及实现函数
//Point& operator++(Point& pin);
//此处的返回值为啥不是void呢?
//前置++是自身变量的++(即对象本身的自增),我传递的参数是引用,改变的就是对象本身,为啥还要将对象返回出来呢?
//首先明确一点 运算符重载是一个函数,假设 p1+(++p2) 如果返回NULL 那么p1+这个运算就会有问题
p1.PrintfA(); //类的成员函数 运算符重载
//前置--
--p1;
//步骤1:首先承认运算符重载是一个函数
//operator--()
//步骤2:根据操作数,写出参数列表
//p1.operator--()
//步骤3:根据业务完成函数返回值,以及实现函数
//Point& operator--();
p1.PrintfA(); //全局函数 运算符重载
//后置++(后置++ 必须运算完成之后,自身才可以自增)
//p1++;
//步骤1:首先承认运算符重载是一个函数
//operator++()
//步骤2:根据操作数,写出参数列表
//operator++(Point& pin,int)
//步骤3:根据业务完成函数返回值,以及实现函数
//Point operator++(Point& pin, int) //特别注意:这里后置++的返回值必须是Point对象 不可以是引用
//因为如果是引用,返回值是一个临时变量,执行return temp;之后这个临时变量会被销毁
//引用的话会继续指向这个被销毁的临时变量,出现脏数据、
//但是返回是Point(匿名对象)就会不一样,执行return temp;之后,c++编译器生成一个匿名对象
//把临时变量拷贝到匿名对象中,执行Point p3 = p1++;,匿名对象会直接转化成p3,二不会被销毁
//这样的结果才是正确的,因此我们需要改变operator+(Point p1, Point p2)函数,参数类型只能是Point
//而不可以是Point &引用;因为p1+p2的返回值应该是一个临时变量,而不能改变p1或者p2本身的值
//当然我并不是说operator+(Point &p1, Point &p2)重载+号就是错误,但是在本场景下,不能使用引用 Point p2(, );
Point p3 = p1++;
Point p4 = p1 + (p2++);
cout << "p4-------------------" << endl;
p4.PrintfA();
cout << "p2-------------------" << endl;
p2.PrintfA(); //类的成员函数 运算符重载
//后置--
cout << "后置-- p1的原先值" << endl;
p1.PrintfA();
p1--;
cout << "后置-- p1的结果值" << endl;
p1.PrintfA();
//步骤1:首先承认运算符重载是一个函数
//operator--()
//步骤2:根据操作数,写出参数列表
//operator--(int)
//步骤3:根据业务完成函数返回值,以及实现函数
//Point operator--(int) } void main(){
ProtectA();
system("pause");
}

C++ 运算符重载二(一元运算符重载)的更多相关文章

  1. 【C/C++开发】运算符重载二

    C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类 ...

  2. 动态对象创建(二)重载new和delete

    动态对象创建(二)重载new和delete 前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常 ...

  3. C++第五次作业--运算符重载和函数重载

    C++ 运算符重载和函数重载 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是 ...

  4. 009PHP基础知识——运算符(二) 逻辑运算符

    <?php /**运算符(二) 逻辑运算符: */ //1.逻辑与 and或&& 左右两边表达式均成立TRUE ,返回真值: /*$uname='admin'; $upwd='l ...

  5. C++ 重载操作符- 02 重载输入输出操作符

    重载输入输出操作符 本篇博客主要介绍两个操作符重载.一个是 <<(输出操作符).一个是 >> (输入操作符) 现在就使用实例来学习:如何重载输入和输出操作符. #include ...

  6. C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. C++实验二——函数重载、函数模板、简单类的定义和实现

    一.实验过程 函数重载编程练习 实验要求:编写重载函数add(),实现对int型,double型,complex型数据的加法.在main函数中定义不同类型的数据,调用测试. 代码实现: 先是简单的体验 ...

  8. 关于C++中操作符重载的疑问 :四个运算符=, -&gt;, [], ()不可以重载为全局函数(友员函数)

    转载自:http://blog.csdn.net/u014610226/article/details/47679323     以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需 ...

  9. 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

    一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...

随机推荐

  1. 微信小程序 - 选取搜索地点并且显示(map)

    演示如下,使用时,你也许会配合它:腾讯地图路线规划 wxml: <view class='address' bindtap='onChangeAddress'> <input cla ...

  2. Sword框架解析——知识采集流程页面初始化

    Sword框架解析——知识采集流程页面初始化 Sword框架解析知识采集流程页面初始化 问题解答流程采集新增页面初始化 1后台t_xt_gnzy表和BLH类 2BLH类的写法前台目录树代码 3登录系统 ...

  3. Jquery重新学习之五[操作JSON数据]

    Jquery操作Json格式的数据在我们平时的项目中也经常运用:最近看Jquery权威指南中就有一章节是对这方面的整理总结:最后通过一个Asp.net结合一般处理程序ashx的实例,基本上能满足项目中 ...

  4. Object.create(null) 和 {} 区别

    Object.create(null) 创建一个空对象,此对象无原型方法. {} 其实是new Object(),具有原型方法. 应用: 使用Object.create(null)的一个重要应用是:创 ...

  5. Java运行时异常和非运行时异常

    1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...

  6. java线程--volatile实现可见性

    volatile关键字: 1)能够保证volatile变量的可见性 2)不能保证volatile变量复杂操作的原子性. volatile如何实现内存可见性: 深入来说:通过加入内存屏障和禁止重排序优化 ...

  7. Python 3.x 连接 pymysql 数据库

    首先,需要安装库: 使用 pycharm IDE,如PyCharm,可以使用 project python 安装第三方模块. [File] >> [settings] >> [ ...

  8. mybatis实战教程(mybatis in action)之四:实现关联数据的查询

    有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表 ...

  9. Linux命令-目录处理命令:mkdir

    mkdir /tmp/beijing mkdir -p /tmp/shijiazhuang/yuhuaqu 一条命令可以同时创建父目录和子目录 mkdir /tmp/beijing/chaoyangq ...

  10. C#指南,重温基础,展望远方!(9)C#接口

    接口定义了可由类和结构实现的协定. 接口可以包含方法.属性.事件和索引器. 接口不提供所定义的成员的实现代码,仅指定必须由实现接口的类或结构提供的成员. 接口可以采用多重继承. 在以下示例中,接口 I ...