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...