IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ - 前置操作符++i与后置操作符i++ -> 正文阅读

[C++知识库]C++ - 前置操作符++i与后置操作符i++

1.值得思考的问题

下面的代码有没有区别?

i++;       //i 的值作为返回值,i自增1。
++i;       //i自增1,i的值作为返回值

代码示例:

#include <iostream>
 
using namespace std;
 
int main()
{
    int i = 0;
 
    //++i += 1; //使用这个正常,打印结果2
    i++ += 1;    //使用这个报错。error: lvalue required as left operand of assignment
 
    cout << "i = " << i << endl;
 
    return 0;
}

编译错误分析:

++i +=1,等效于 ++(i = i + 1),这时候i还是变量,可以进行运算。

i++ +=1,等效于 ++i = 1,? 1 = 1 + 1,这时候编译就会犯错误。

2.前置操作符++与后置操作符++的效率

对于基础类型的变量:

-> 前置++的效率与后置++的效率基本相同。

对于类类型的对象:

-> 前置++i的效率高于后置i++。

-> 尽量使用前置++操作符提高程序效率。

代码示例:验证基础类型的变量

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    int i = 0;
 
    i++;
 
    ++i;
 
    return 0;
}

结果:
++i和i++作为单独一行代码时效果一样,查看汇编代码一致。

3.++操作符重载(--操作符自己来)

++操作符可以被重载:

-> 全局函数和成员函数均可进行重载。

->?重载前置++操作符不需要额外的参数。

-> 重载后置++操作符需要一个int类型的占位参数。

代码示例:验证类类型的对象

#include <iostream>
#include <string>
 
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)  //后置++,编译器提示,需要占位参数int
    {
        Test ret(mValue);   //保存++之前的mValue值,栈对象ret,多写程序开销
        
        mValue++;  //后++
        
        return ret;    //先返回,再++
    }
};
 
int main()
{
    Test t(0);
 
    t++;
    
    ++t;
    
    return 0;
}

分析:

前置++直接在原来的基础上++就好,不需要建立栈对象。

后置++效率低,因为它需要在栈上创建临时对象,出栈时还需要销毁对象;前置++没有这种复杂操作。

小结:

-> 编译优化使得最终的可执行程序更加高效。

-> 前置++操作符和后置++操作符都可以被重载。

-> ++操作符的重载必须符合其原生语义。

-> 对于基础类型,前置++与后置++的效率几乎相同。

-> 对于类类型,前置++的效率高于后置++。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:25:18  更:2021-08-12 16:25:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:55:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码