类中定义自身类的对象
在C++的類定義中,是不能夠在類中定義自身類的對象的,但是可以定義自身類的指針對象和引用。
class A
{
public:
?A ()
?{
??cout<<"Constructor method."<<endl;
?};
?A a;
};
?
void main()
{
?A aaaaa;
}
以上代碼編譯提示錯誤,a' : uses 'A',which is being defined。
如果把a換成*a就可以了。
?
而java就可以在類中定義自身類的對象。
class a{
??public a aa;
?}
?
這樣的代碼可以順利編譯,但是如果在定義的時候創(chuàng)建了對象實例,則也會編譯失敗的。
class a{
??public a aa = new a();
?}
提示錯誤:
Exception in thread "main"java.lang.StackOverflowError
?at test1$abc.<init>(test1.java:4)
很明顯,堆棧溢出了。
為什么呢?其實以上問題的本質是一致的,就是是創(chuàng)建對象實例的時機問題。
在C++中,在定義對象的時候就創(chuàng)建了對象的實例,即分配了對象的內存空間。在java中,只有調用new的方法才能創(chuàng)建對象的實例,在內存中分配對象的空間。所以,如果在定義的時候就定義自身類的對象,就會導致遞歸創(chuàng)建對象的現(xiàn)象,創(chuàng)建了對象aa,因為aa是一個A類的實例,那么aa中還有一個aa對象,還要創(chuàng)建一個aa對象,為其分配內存…………,這樣就會導致遞歸創(chuàng)建對象,結果就是內存被消耗殆盡。當然,這樣的設計本身也不合理。
在JAVA中,對象只有在new時才能創(chuàng)建對象實例,所以類中可以定義自身類的對象。如果把上例修改成令一個類的實例,則不會有任何問題。
class a{
??public?b?bb = new b();
?}
這樣的代碼是可以編譯并運行的。
但如果在java的類中用new創(chuàng)建自身的對象時,將其聲明為static則是可以的。這是因為static成員只在類的對象被創(chuàng)建或類的靜態(tài)成員(方法)被調用時進行一次初始化,其后即再不創(chuàng)建和初始化。
總結
以上是生活随笔為你收集整理的类中定义自身类的对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++类中不能定义自身类类型成员变量
- 下一篇: string 类的初始化和赋值(程序成长