出现的问题
以前是用数组做参数,都会传递数组的元素个数。在初始化构造函数时,因为手机号的个数是不确定的,所以需要使用一个数组。但是 重点来了,成员函数中不存在手机号的个数这一个成员变量,所以在构造函数传参时,我感觉不应该传入这一个参数,应该根据实参传递的数组,在构造函数中找出电话的个数。
解决问题的过程
一开始,我使用的sizeof方法。
一开始我以为sizeof方法就是计算数组的元素个数的。使用后发现结果不对,经过查阅资料,我才知道sizeof()计算的是变量在内存中的内存字节数。对于数组作为参数的时候,如果不传递数组的元素个数无法使用。原因在下面介绍。
- 对于普通的数据类型,指针类型
1、sizeof指的是哪一部分内容的内存空间
int a=9;
cout<<sizeof(a);
int *p;
cout<<sizeof(p);
- 静态数组
1对于静态数组,sizeof()的值,指的是数组名指向的内容所占的字节数
int a[6]={1,2,3};
cout<<sizeof(a);//虽然只有三个值,但是剩下的三个空间会默认初始化为0,所以sizeof的值是6个Int型的数据所占的内存数
2、如何使用来计算数组的容量;注意:是容量不是元素个数
int a [6]={}1,2,3,4,5,6};
int n=sizeof(a)/sizeof(a[0]);
cout<<n;
-
动态数组
动态数组的数组名就是一个普通的指针变量 -
数组作为实参传递:重点
当数组当作参数传递的时候它就弱化为一个同类型指针
也就是说,当定义了一个函数,函数的参数是一个数组,对于实参来说,是一个数组名,也就是一个指针,但是它的字节数指的是它所指向的内存的字节数。但是对于形参来说,就是一个单纯的指针变量。虽然可以通过数组的方法获取值,但是他的sizeof值即一个普通的指针类型的内存数。
那么此时如何获取数组中有多少元素呢?(是元素,不是容量)(实参可以是动态数组,也可以是静态数组)
答:此时,要定义一个容量很大的数组,此数组的容量要大于元素个数
然后,定义一个计数器,利用数组中存放内容的默认情况(int 默认是0,string默认是""…),当数组遍历到默认值时,遍历结束。传出计数器的值
例子如下:这是一个构造函数。其中tel初始化时,因为不可以传递元素的个数,所以采用上述方法进行初始化,代码的逻辑仔细想想便可明白
易错点:在main方法中,存储tel的数组容量必须大于已经存储的数据的个数,才会有系统的默认值
Person(string idnum, string pname, string *ptel, string pqq, string pweixin, string paddress) : idNum(idnum)
{
name = pname;
string *p = ptel;
int iLen = 0;
while (p[iLen] != "")
{
iLen++;
// *p++;
p++;
// a++;
}
tel = new string[iLen + 1];
for (int i = 0; i < iLen + 1; i++)
{
tel[i] = ptel[i];
// cout<<p[i]<<" ";
// cout<<ptel[i]<<" ";
}
qq = pqq;
weixin = pweixin;
address = paddress;
}