笔记目录
前自增、后自增函数重载
其实,前后自增都是单目运算符,参数中的int只是起标识符区分的作用
没有标识符的是前自增,有标识符的是后自增
前自增、前自减函数先进行运算,然后返回值
后自增、后自减函数先返回值,然后运算
为了实现后自增,需要先创建一个临时对象,再运算,再返回临时对象
Point例子如下(已对流输出运算符进行了重载)
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
class Point
{
double x, y;
public:
Point(double a, double b) : x(a), y(b) {}
Point(const Point &p):x(p.x),y(p.y){}
friend ostream &operator<<(ostream &o,const Point &p)
{
o << "(" << p.x << ", " << p.y << ")\n";
return o;
}
Point &operator++()
{
x++; y++;
return *this;
}
Point operator++(int)
{
Point p(*this);
x++; y++;
return p;
}
};
int main()
{
Point a(1, 2);
cout << "a: " << a;
cout << "++a: " << ++a;
cout << "a++: "<< a++;
cout << "a: "<< a;
}
值得注意的是,后自增运算符返回的是临时对象,不能作左值了(因为会析构),所以函数返回类型应该不是引用,而是对象;
由以上函数可知,由于后自增需要构造临时变量,所以效率远低于前自增,这也是竞赛中推荐使用前自增的原因之一
进制转换函数
代码如下,函数的两个参数分别是其他进制的字符串和进制数,返回值是对应的十进制值
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int getTenRadix(string str,int radix)
//两个参数分别是其他进制的字符串和进制数,返回值是对应的十进制值
{
int strint[1000]= {0};
int len=0;
for(; str[len]!='\0'; len++) {} if(len==0)
{
return 0;
}
int i;
for(i=0; len-1; len--,i++)
{
int t=len-1;
strint[i]=1;
while(t)
{
strint[i]=strint[i]*radix;
t--;
}
}
strint[i]=1;
int sum=0;
for(i=0; strint[i]!=0; i++)
{
if(str[i]>='a'&&str[i]<='z')
{
sum=sum+((int)(str[i]-'W'))*strint[i];
}
else
{
sum=sum+((int)(str[i]-'0'))*strint[i];
}
}
return sum;
}
int main()
{
char s[100];
int r,p=0;
while(1)
{
if(p){cout << "下一组数据: \n" ; }
if(s[0]=='0'&&r==0){break;}
printf("请输入一串其它进制的字符:");
scanf("%s",&s);
printf("请输入它的进制:");
scanf("%d",&r);
cout << "\n它在十进制中的值是: ";
cout << getTenRadix(s,r) << endl << endl;
printf("退出程序——请输入 0 0 回车\n\n");
p++;
}
// cout << "请按下Enter键以返回\n";
// cout << "Press any key to return\n";
}