先进行总结:
- 为什么(i++)++被砍掉了
自身的运算规则以及返回值,决定了自己无法多次进行++ - 为什么++i的效率就高
因为++i的前置运算规则,让他自身先进行++再去返回自身
而不像++i需要先去创建一个临时变量存储原先的值,再去进行自身++,后将临时变量返回
我们可以把任何内置数据类型想象成一个类,只是编译器早已经知道了我们如何进行操作,如何进行++
它是由于编译器已经给出了规定的操作,我们只需要按照要求去进行操作,不需要我们自己再去写而已
所以我们可以自己写一个整形数据,去了解++i的效率为什么比i++的效率高
前置递增 and后置递增
前置递增: 先进行递增,再参与运算
后置递增: 先参与运算,再进行递增
前置递增 后置递增
int a = 10; int b = 10;
cout << ++a ; cout << b++;
cout << a << endl; cout << b << endl;
结果: 11 11 结果 : 10 11
自定义整形类,准备工作
- 1.我们先自己定义一个整形类
class Myint
{
public :
int Num;
Myint(); //无参构造方法
Myint(int num); //有参构造方法
//Myint(Myint & a); //拷贝构造方法
//使用创造方法后面会解释
//为什么++i 和i++ 的返回值不同的原因
//在++(++i)不使用引用会产生的问题
~Myint(); //析构
Myint& operator ++ (); // ++ i
Myint operator ++ (int); // i ++
//利用占位参数区分不同的调用方式
};
- 2.对于cout去输出一个类,它并不知道该怎么去输出,所以我们要自己重载cout,告诉cout我们要输出的内容是什么。
ostream & operator << (ostream & cout,Myint a)
{
cout << a.Num ;
return cout;
}
准备工作做完了,现在开始动手写++ i
++i
由于++i是先进行递增,再参与运算,所以我们应该在重载函数中先让Num++,再去返回结果
Myint& Myint :: operator ++ ()
{
this -> Num ++;
return * this;
}
现在我们进行输出
void test01()
{
Myint a(10);
cout << ++a << endl;
cout << a << endl;
}
int main(void)
{
test01();
}
i++
由于i++是后置递增,会先参与运算,再去进行递增
当我们设计重载函数的时候,如果先去返回原先的值,再去进行递增,这显然是不行的,都已经返回了值,后面的代码自然不会执行
所以我们应该先去创建一个Myint类,保存下原来的值,对自身的值进行++,再去返回刚刚保存的值
Myint Myint :: operator++(int)
{
Myint temp = this -> Num;
this -> Num ++;
return temp;
}
函数进行测试
void test02()
{
Myint a(10);
cout << a ++ << endl;
cout << a << endl;
}
int main(void)
{
//test01();
test02();
}
为什么++i 的效率比i++高
为什么i++不用返回引用
从上面两个重载函数进行对比,
- i++是后置递增,需要先参与运算,运算完之后再去进行++
这就要求,该重载函数必须先创建一个新的整形类去记录原先的值,再让自身++后,返回这个新的整形类,达到后置递增的目的 - 而++i前置递增,直接就可以在自身的基础上++,返回自身
为什么(i++)++被砍掉了
当我们用内置数据类型时,对一个整形变量进行连续后置递增,会发现计算机无法做到,这就和这两个函数的返回值有关系了。
可以看到,i++的返回值是Myint ,而++i的返回值是&Myint,++i可以将自身进行返回
假如我们将++i的返回值改成Myint,会发生什么
Myint Myint :: operator ++ ()
{
this -> Num ++;
return * this;
}
void test03()
{
Myint a(10);
cout << ++(++a) << endl;
cout << a << endl;
}
int main(void)
{
//test01();
//test02();
test03();
}
结果不应该是12,12嘛,怎么就变成了12,11
由于++i的返回值是Myint,所以编译器会自动创建一个新的变量,在第二次进行++的时候,用的已经不是原先自身的变量了,但是引用用的仍然是自身的变量
就正是因为这样,在进行++i的时候,如果想完成后置递增的目的,就必须返回的是一个存储原先值得到变量,而不能去返回自身,如果想要去返回自身,就无法进行++的操作了
后置递增的目的本来就是为了先运算,后递增, 如果把自身最重要的功能砍掉了,那不就和前置递增没有任何区别了
为什么要使用占位参数
函数重载的判断依据
- 1.函数形参的个数
- 2.函数形参的类型
- 3.形参的顺序
- 4.不能把自身返回值作为函数重载的条件
由于返回值不能作为函数重载的顺序,而两个函数又都不需要任何的参数,所以就需要加入一个占位参数,去让机器区分开两者的区别