出現的問題
以前是用數組做參數,都會傳遞數組的元素個數。在初始化構造函數時,因爲手機號的個數是不確定的,所以需要使用一個數組。但是 重點來了,成員函數中不存在手機號的個數這一個成員變量,所以在構造函數傳參時,我感覺不應該傳入這一個參數,應該根據實參傳遞的數組,在構造函數中找出電話的個數。
解決問題的過程
一開始,我使用的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;
}