公司网站别人做的怎么签合同,佳木斯网站建设,开发工程师的岗位要求,腾讯云服务器10元一年今天在阅读《google c 编程风格》的文档的时候#xff0c;5.10. 前置自增和自减#xff1a;有一句话引起了我的注意#xff1a; 对于迭代器和其他模板对象使用前缀形式 (i) 的自增, 自减运算符.#xff0c;理由是 前置自增 (i) 通常要比后置自增 (i) 效率更高。于是我查了查… 今天在阅读《google c 编程风格》的文档的时候5.10. 前置自增和自减有一句话引起了我的注意 对于迭代器和其他模板对象使用前缀形式 (i) 的自增, 自减运算符.理由是 前置自增 (i) 通常要比后置自增 (i) 效率更高。于是我查了查前置和后置的区别。 注意《more effective c》条款8也专门叙述了问题。后来我发现下面的文章基本就是它的翻版哈哈 前置和后置的区别 《C专家编程》中有如下描述P276人民邮电出版社 a表示取a的地址增加它的内容然后把值放在寄存器中 a表示取a的地址把它的值装入寄存器然后增加内存中的a的值也就是说操作的时候用到的都是寄存器里面的值即自增前的值 另外网上找了篇文章通过从运算符重载的角度来探讨他们的不同如下 假设有一个类Age描述年龄。该类重载了前置和后置两个操作符以实现对年龄的自增。 class Age { public: Age operator() //前置 { i; return *this; } const Age operator(int) //后置 { Age tmp *this; (*this); //利用前置 return tmp; } Age operator(int i) //赋值操作 { this-i i; return *this; } private: int i; }; 从上述代码我们可以看出前置和后置有3点不同 返回类型不同形参不同代码不同效率不同返回值类型的区别 前置的返回类型是Age后置的返回类型const Age。这意味着前置返回的是左值后置返回的是右值。关于左值和右值的讨论很多见本文下面 左值和右值决定了前置和后置的用法。 int main() { Age a; (a); //编译错误 (a); //编译错误 a 1; //编译错误 (a); //OK (a); //OK a 1; //OK } 的类型是const Age自然不能对它进行前置、后置、赋值等操作。 a的类型是Age当然可以对它进行前置、后置、赋值等操作 注:我们只要重载时只要认清前置是没有参数的后置是有一个int型参数的就行了实际调用的区分是编译器的事 a的返回类型为什么要是const对象呢 有两个原因 如果不是const对象a()这样的表达式就可以通过编译。但是其效果却违反了我们的直觉 。a其实只增加了1因为第二次自增作用在一个临时对象上。另外对于内置类型(i)这样的表达式是不能通过编译的。自定义类型的操作符重载应该与内置类型保持行为一致 。a的返回类型如果改成非const对象肯定能通过编译但是我们最好不要这样做。 a的返回类型为什么是引用呢 这样做的原因应该就是与内置类型的行为保持一致。前置返回的总是被自增的对象本身。因此(a)的效果就是a被自增两次。 形参的区别 前置没有形参而后置有一个int形参但是该形参也没有被用到。很奇怪难道有什么特殊的用意 其实也没有特殊的用意只是为了绕过语法的限制。 前置与后置的操作符重载函数函数原型必须不同。否则就违反了“重载函数必须拥有不同的函数原型”的语法规定。 虽然前置与后置的返回类型不同但是返回类型不属于函数原型。为了绕过语法限制只好给后置增加了一个int形参。 原因就是这么简单真的没其他特殊用意。其实给前置增加形参也可以增加一个double形参而不是int形参也可以。只是当时就这么决定了。 代码实现的区别 前置的实现比较简单自增之后将*this返回即可。需要注意的是一定要返回*this。 后置的实现稍微麻烦一些。因为要返回自增之前的对象所以先将对象拷贝一份再进行自增最后返回那个拷贝。 在Age的代码中后置利用了前置来实现自增。这样做是为了避免“自增的代码”重复。 在本例中自增的代码很简单就是一行i没有必要这样做。但是在其它自增逻辑复杂的例子中这么做还是很有必要的。 效率的区别 如果不需要返回自增之前的值那么前置和后置的计算效果都一样。但是我们仍然应该优先使用前置尤其是对于用户自定义类型的自增操作。 前置的效率更高理由是后置会生成临时对象。 从Age的后置的代码实现也可以看出这一点。 const Age operator(int) //后置 { Age tmp *this; (*this); //利用前置 return tmp; } 很明显tmp是一个临时对象会造成一次构造函数和一次析构函数的额外开销。虽然编译器在某些情况下可以优化掉这些开销。但是我们最好不要依赖编译器的行为。 所以在非内置类型的时候尽量使用前置因为效率高后置自增效率低 原文链接http://blog.csdn.net/randyjiawenjie/article/details/6747720转载于:https://www.cnblogs.com/balingybj/p/4736195.html