C 在類中能定義本身型別的成員嗎?

時間 2021-05-30 08:58:40

1樓:番茄.go

至少有兩種情況是允許的。

指標靜態成員變數

Member.cpp

#include

classA};

AA::a

;int

main

()執行

$ g++ -Wall -O2 -o Member Member.cpp

$ ./Member

An object of class A.

An object of class A.

An object of class A.

2樓:神念的經

————故事1————

class

MyClass

;編譯器:這個MyClass類有些什麼成員,我看看……

它居然有個MyClass成員物件!

那這個MyClass物件裡是不是就也有個MyClass物件?

那這個MyClass物件裡的MyClass物件是不是也該有個MyClass物件?

編譯器:算了算了,報錯吧

(當然其實編譯器看到第一層套娃的時候就會報錯了)

————故事2————

class

MyClass

;編譯器:這個MyClass類有些什麼成員,我看看……

它有個成員是MyClass的指標!

哦,那我就只用開闢乙個能hold住乙個指標的記憶體就行了

指標不就是指向乙個位址嘛,乙個位址不就相當於乙個對應著它自己的整數嘛,要不了幾個位元組

那這個指標加加減減時到底走多少位元組怎麼確定呢……

先放著吧,我把整個類定義掃完不就知道MyClass所有成員變數要多少位元組了?

嗯,完美!

(類定義中並不能定義自身類的成員物件,但是可以定義指向自身類的指標。)

————故事3————

class

MyClass

foo,

bar;

編譯器:這個MyClass類有些什麼成員,我看看……

它居然有個靜態MyClass成員物件!

哦,那就說明這個靜態物件是所有MyClass物件都可以用的

既然它是public那麼甚至在類外可以用MyClass::object來使用這個靜態物件

(如果是private或protected?那無非就是類外不能用嘛,除非你是友元)

但是,沒有任何乙個MyClass物件是真正擁有這個靜態物件的。只是能用。只是可以通過foo.

object或者bar.object之類的用它。它自己單獨佔一塊兒記憶體,任何MyClass物件都不需要為這個靜態物件分配記憶體。

那這個靜態物件到底要多少記憶體呢?

把整個類定義掃完不就知道了?可以的。

還有,這個只能算宣告!我還要找找它在哪兒定義!

MyClass

MyClass

::object

;//definition here!

intmain

()哦,找到了,那就可以了。

(編譯器掃到main()的時候)

編譯器:這個套娃真的是太草了哈哈哈哈……MDZZ。

3樓:梁兄

這種用法,應該是有很多地方要用到B類物件,但都是用的同乙個就是x。

比較常見的寫法是:static B* x; //宣告static B* GetInstance();

你這種估計是C++11或C++17吧,C++98不支援

4樓:d41d8c

其實是不能定義的,因為在遇到}之前類都是不完整的(incompletely-defined, or incomplete)。

但是這裡static B x; 不是定義,只是宣告。還要另找乙個地方定義,否則如果用了就可能有鏈結錯誤。

C++17以後允許直接在類裡面定義靜態成員變數,這個問題就比較明顯了。

class X ;

C 中類的資料成員(data member)能出現未初始化(uninitialized)的狀態嗎?

1.如果在乙個函式類定義,那麼在這兩個類裡的資料成員都未初始化,都是不確定的值。如果是在全域性空間定義,那built in type就是預設值,類就是預設構造的。你可以自己列印出來看看 2.是不是 class type 在進行預設初始化的時候遞迴呼叫父類的建構函式,而且類中的資料成員也按照規則進行初...

是否可以在成員類中定義 指向父類的指標 ?

張翼德 這要分class B的宣告 h 和實現 cpp 檔案兩個地方 如果你在class B的宣告 h 裡沒有用到任何class A 的成員,比如就像你問題裡寫的那樣,只是用到了class A的名字,那你只要在class B前面宣告 class A 讓compiler知道 A是個class 就行了,...

c 中如何給類的私有成員賦值?

zhLzm 最好的是通過建構函式給類的私有成員進行初始化 可以有多種初始化建構函式 如果需要在操作中設定某個私有變數基於C 類的封裝特性,最好編寫一個函式去修改需要改變的成員產量。 王祺 假設你的類在a.h中 define private public include a.h undef priva...