class ObjectB{};
class ObjectA{
public:
ObjectB array[5];//對象數組作為類的成員
}
那樣的話對象數組的初始化會變得很麻煩,
因為數組名不能作為左值,所以不可以指針傳遞的方式賦值。
而且不能通過參數列表(構造函數后面加一個冒號)的方式初始化,
所以只能讓類ObjectA自動調用類ObjectB的無參構造函數.
---------------
#include <iostream.h>
#include "stdlib.h"
class ObjectB
{
public:
int a;
public:
ObjectB(int m=0)
{
a=m;
}
};
class ObjectA
{
public:
ObjectB Array[5];
public:
ObjectA(int *p)
{
Array[0]=ObjectB(p[0]);
Array[1]=ObjectB(p[1]);
Array[2]=ObjectB(p[2]);
}
};
int main()

{
int p[5]=
{0,2,2,3,4};
ObjectA am=ObjectA(p);
cout<<am.Array[1].a<<endl;
return 0;
}---------------
我們可以使用替代方式:
class A{};
classB{
public:
A*a;//A類型的指針作為類的成員
}
同樣帶來很大的問題,
(1)淺拷貝,深拷貝的問題,除非重載拷貝構造函數,類B才能實現深拷貝,因為成員中有指針,所以無法簡單的用拷貝構造函數生成一個新對象,而用無參構造函數生成的新對象也會有問題,因為里面的指針一般都默認為NULL了。
重載拷貝構造函數的時候需要申請一定長度的內存,將拷貝對象的指針所指向的空間拷貝到新申請的空間,再進行操作。注意申請后要釋放。
一個拷貝構造函數的例子
SparseMatrix::SparseMatrix(const SparseMatrix&s)
{
Rows=s.Rows;
Cols=s.Cols;
Count=s.Count;
smArray=new Trituple[6];
//此處還需要復制對象
}----------------------
補充知識:
------------------http://www.ksarea.com/articles/20070829_memory-partition-stack-heap-difference.html
C/C++應該是大學里最先接觸的編程語言,它們的重要性不言而喻。但是我始終抱著“數組名就是指針”的錯誤信條到現在,可能是因為大學老師錯誤的講解使我一直保留著這種誤解。指針是C/C++語言的特色,而數組名與指針有太多的相似,甚至很多時候,數組名可以作為指針使用,所以也難免在學習中將兩者混淆。這里介紹下指針和數組名的區別:
1.指針和數組名占據的內存空間大小不一樣,如下程序1:
char str[10];
char *pstr=str;
cout<
cout<<sizeof
第一行輸出結果是:10,第二行輸出結果是:4
從這里我們可以看出:數組名對應著(而不是指向)一塊內存(數組所占的內存區域)或者說是指代數組這種數據結構,其地址與容量在生命期內保持不變,只有數組的內容可以改變。指針對應著一個占據4個字節(Win32)的內存區域,而指向這4個字節所存儲的地址所對應的內存單元,它可以指向任意類型的內存塊。因此,sizeof(str)值為數組占據的內存空間大小即10個字節,而sizeof(pstr)值為指針的值占據的內存空間大小即4個字節。
2.數組名不是指針,但是在一定的情況下轉換為指代數組的首地址的指針,而這個數組名轉為的指針只能是指針常量。
在以下兩種情況下才能進行這種轉換:
a.在程序1第二行代碼中,將數組名直接賦值給指針,此時數組名轉換為指向數組的首單元的常量指針。
b.直接將數組名作為指針形參的時候,數組名則轉換為指向數組的首單元的常量指針進行傳遞,如下程序2:
void fun(char str[])
{
cout<
str++;
}
void main()
{
…
char str1[5];
fun(str1);
…
}
注意:數組名作為函數形參進行傳遞時,在子函數體內,它已經不再是一個指針常量,而是變成一個真正的指針,可以進行增減等操作,可以被修改。所以程序2中子程序第一條語句輸出的sizeof(str)的值為4.
既然數組名可以被看作指針常量,而常量是不能修改的,那么如下代碼是不允許的:
char str[10];
str++;
但如下代碼則合法的:
char str[10];
char *pstr=str;
pstr++;
3.使用指針訪問數組和使用數組名訪問數組本質不同。
例如:
char str[7]=”ksarea”;
char *pstr=str;
cout<
其中str[3]和pstr[3]返回的都是字符’r',但是編譯器產生的執行代碼卻不一樣。對于str[3],執行代碼是從str開始,向后移動兩個字節,然后取出其中的字符;而對于pstr[3],執行代碼是從pstr中取出地址,然后在其上加3,然后取出對應內存中的字符。當然,如果pstr是指向int型的指針,那么pstr[3]的處理過程是從pstr中取出地址,然后在其上加上3*sizeof(int),最后取出對應內存中的字符,其他的數據類型一次類推。


