來自CSDN的問題
舉個例子
=======================
Name *name1=new Name[4];
Name *name2=new Name();
假設Name類有一方法void show();
======================
我一直以為由于都是由new 構成的,所以,第一個name 和第二個name都是指針。今天剛好用第一個類對象的方法:name1[0]->show(); 編譯器就報錯,當我換成name1[0].show();時候,就能正確運行了
想請問下大家,既然動態內存是由new分配的,那name1應該也是指針啊,因為name1前有個*(即*name1),并且又是又new分配空間的。但是它調用方法時候卻又只是表現出只是個Name[]的數組元素。
有朋友能告訴下我到底什么樣的new 才算真正的動態內存分配,才算指針嗎???
謝謝!!!
以下為解答內容,各段為一個解答。
name1是數組指針,name1[0]就是數組中的值了.
你可以直接用name1->來調用.
name1就是指針,它和name2并沒有什么不同,同樣你也可以用name2[0].來調用函數.
Name[0]指的是數組中的第一個元素,不是個指針~~~~~~~
在定義Name *name1=new Name[4]時name1確實是個指針,他指向了數組Name[] 而用name1->show()應該是正確的,這樣的話就相當于將函數show的首地址給了name1, Name *name2=new Name();表示開辟了一個函數Name的內存地址,name2表示了這個函數的首地址
我一直以為由于都是由new 構成的,所以,第一個name 和第二個name都是指針。
--------------------
正是如此!
都是指針,但是,name1[0]就是值了 ... 同樣,name2[0]也是一個值,樓主自己試試就知道了 ..
Name *name2=new Name();
//首先構造Name()默認構造函數對象然后new出對象拷貝構造出來
Name *name2=new Name[3];
//是先分配空間然后構造對象
Name1[0]是個對象(如果你拷貝了其他對象給他,當然你是要拷給他才能用)
Name1,Name2都是指針
和
int* p1 = new int[4];
int* p2 = new int;
一樣
指針是這樣用滴~~~
for(int i = 0;i < 4; i++) {
(name1+i)->show();
}
name2 是構造單個對象指針
name1是構造四個對象的指針。具體到每一個對象就不是指針,而是數組
//#include
class A
{
public:
int a;
int& get(){return a;};
void set(int i){ a=i;};
A()
{
a=1;
};
};
int main()
{
//
A* a1=new A();
A* a2=new A();
A* pA[2]={a1,a2};
int b=pA[0]->get();
//
int pI[2]={1,2};
int sum=pI[1]+pI[2];
//
A* pB=new A[2];
pB[1].set(1);
int x=pB[1].a;
return 0;
}
是指針,但是是數組的指針
比如這樣
name *p = new name[4];
p->show()相當于p[0].show();
通俗的說,你在定義的時候的那個name*中的*號指的是對象數組,并不是對象指針
name1[0]->show();里的name1[0]改成name1就OK了。樓主可以補一補數組的有關知識。
========================================================
copy了這篇文章,其實我只想說下我的看法。
Name *p=new Name[4];
p->show();????? //正確
p[0].show();??? //正確
第一個可以這樣理解:指針P指向數組首地址,其實就是P指向Name[4]數組中第一個元素的地址,所以,如果使用p->show(),則意思其實就是讓數組中第一個元素,即第一個對象name調用自身show(),再說白點,就是name.show();
第2個可以這樣理解:p[0]可以理解成P指向數組中第[0]個元素,所以就有了p[0],所以更會有了p[0].show();