北京通州做网站,seo优化报价公司,西安网站制作公司推荐,元做网站前置/–与后置/–
C中的和–操作符存在前置式与后置式#xff0c;最基本的#xff0c;作为一名程序员#xff0c;你应当了解它们实现的不同#xff1a;
i;
i;以上两行代码如果单独使用#xff0c;在功能上是一致的#xff0c;它们都实现了让变量i加1的操作#xff0c;…前置/–与后置/–
C中的和–操作符存在前置式与后置式最基本的作为一名程序员你应当了解它们实现的不同
i;
i;以上两行代码如果单独使用在功能上是一致的它们都实现了让变量i加1的操作但是实现的机制有所不同
i是先用后加即你在t时刻得到的变量i的值实际上还是原来的值但它实际的值已经被加1i是先加后用即你用的值和变量i当前时刻的值是一样的 int a 1;int b 1;cout a: a 前: a a: a std::endl;cout b: b 后: b b: b std::endl;运行结果
a: 1 前: 2 a:2
b: 1 后: 1 b:2发现没有后置式其实是将变量的值找了个临时变量先存了起来然后再将该变量加1,而前置式则直接将变量加1。
从这个机制上可以下个结论后置式在性能上要逊与前置式。这其实也是在建议你在写for循环时尽量使用前置式i,而不是后置式i。
前置/–与后置/-- 的重载
C允许这两个操作符拥有重载能力。但是这时候你可能发现在语法上似乎出现了问题重载函数是以其参数类型或个数来区分彼此的然而这是个单目运算符无论是前置式还是后置式都没有参数。于是为了填平这个语言上的漏洞只好让后置式有一个int自变量在其被调用的时候编译器默默为该int指定一个0值。
假设我们有一个复数类complex现在为其重载运算符
class complex
{
public:complex operator(){a a1;b b1;return *this;};const complex operator(int){complex temp *this;temp;return temp;};int a 0;int b 0;
};其实前置与后置的功能”先加后用“与”先用后加“已经为这两种操作符的实现指明了路线既然是先加后用那加完之后的和最后使用的应当是同一样东西所以应当返回引用。同理”先用后加“说明应当先把原来的值保存起来再将其加1但是最后还是应当返回其原来的值因为是”先用后加“嘛。另外你还应当注意这里保存完原来的值之后直接调用了前置去实现加1这种操作很好的实现了复用应当被提倡。
但是你可能会奇怪为什么后置必须返回一个const值而不是像前置一样返回引用就好了
首先返回值是因为这是个局部变量一旦出了作用域temp的生命周期就完结了也就不存在引用了其次const 其实是在像”偶像”致敬。偶像谁是偶像int。
是的当你不清楚你的实现应当跟谁保持一致的时候去看看标准库里的数据类型int类型支持 i,但是不支持i 。所以为了跟标准保持一致建议像偶像看起。因此返回const值也就说得通了。
最后附上源码
#include iostreamclass complex
{
public:complex operator(){a;b;return *this;};const complex operator(int){complex temp *this;temp;return temp;};int a 0;int b 0;
};std::ostream operator(std::ostream os, const complex value)
{os value.a value.b ;return os;
}int main()
{int a 1;int b 1;cout a: a 前: a a: a std::endl;cout b: b 后: b b: b std::endl;complex c;cout c: c 前: c 后 c std::endl;return 0;
}