13-重载示例
8.4.1 重载示例
本章前面创建了一个left()函数,它返回一个指针,指向字符串的前n个字符。下面添加另一个left()函数,它返回整数的前n位。例如,可以使用该函数来查看被存储为整数的、美国邮政编码的前3位——如果要根据城区分拣邮件,则这种操作很有用。
该函数的整数版本编写起来比字符串版本更困难些,因为并不是整数的每一位被存储在相应的数组元素中。一种方法是,先计算数字包含多少位。将数字除以10便可以去掉一位,因此可以使用除法来计算数位。更准确地说,可以用下面的循环完成这种工作:
unsigned digits = 1;
while (n /= 10)
digits++;
上述循环计算每次删除n中的一位时,需要多少次才能删除所有的位。前面讲过,n / = 10是n = n / 10的缩写。例如,如果n为8,则该测试条件将8/10的值(0,由于这是整数除法)赋给n。这将结束循环,digits的值仍然为1。但如果n为238,第一轮循环测试将n设置为238/10,即23。这个值不为零,因此循环将digits增加到2。下一轮循环将n设置为23/10,即2。这个值还是不为零,因此digits将增加到3。下一轮循环将n设置为2/10,即0,从而结束循环,而digits被设置为正确的值——3。
现在假设知道数字共有5位,并要返回前3位,则将这个数除以10后再除以10,便可以得到所需的值。每除以10次就删除数字的最后一位。要知道需要删除多少位,只需将总位数减去要获得的位数即可。例如,要获得9位数的前4位,需要删除后面的5位。可以这样编写代码:
ct = digits - ct;
while (ct--)
num /= 10;
return num;
程序清单8.10将上述代码放到了一个新的left()函数中。该函数还包含一些用于处理特殊情况的代码,如用户要求显示0位或要求显示的位数多于总位数。由于新left()的特征标不同于旧的left(),因此可以在同一个程序中使用这两个函数。
程序清单8.10 leftover.cpp
// leftover.cpp -- overloading the left() function
#include <iostream>
unsigned long left(unsigned long num, unsigned ct);
char * left(const char * str, int n = 1);
int main()
{
using namespace std;
char * trip = "Hawaii!!"; // test value
unsigned long n = 12345678; // test value
int i;
char * temp;
for (i = 1; i < 10; i++)
{
cout << left(n, i) << endl;
temp = left(trip,i);
cout << temp << endl;
delete [] temp; // point to temporary storage
}
return 0;
}
// This function returns the first ct digits of the number num.
unsigned long left(unsigned long num, unsigned ct)
{
unsigned digits = 1;
unsigned long n = num;
if (ct == 0 || num == 0)
return 0; // return 0 if no digits
while (n /= 10)
digits++;
if (digits > ct)
{
ct = digits - ct;
while (ct--)
num /= 10;
return num; // return left ct digits
}
else // if ct >= number of digits
return num; // return the whole number
}
// This function returns a pointer to a new string
// consisting of the first n characters in the str string.
char * left(const char * str, int n)
{
if(n < 0)
n = 0;
char * p = new char[n+1];
int i;
for (i = 0; i < n && str[i]; i++)
p[i] = str[i]; // copy characters
while (i <= n)
p[i++] = '\0'; // set rest of string to '\0'
return p;
}
下面是该程序的输出:
1
H
12
Ha
123
Haw
1234
Hawa
12345
Hawai
123456
Hawaii
1234567
Hawaii!
12345678
Hawaii!!
12345678
Hawaii!!