本文學習自 狄泰軟體學院 唐佐林老師的 c++課程
物件的初始化是指 對正在建立的物件進行初始值設定,物件的初始化是通過建構函式實現的,建構函式中可以完成目標物件的初始狀態的設定,包括物件的成員變數的設定等等。但是通過建構函式設定的成員變數不是初始化,而是賦值,是對已經存在的變數進行賦值,並非我們所說的初始化,物件的成員變數的初始化只能通過初始化列表來完成,初始化列表是先於建構函式的函式體執行的,即對建立的變數進行初始值設定。
實驗1:類中是否可以存在const成員,可以的話該怎麼初始化
實驗2:初始化列表的使用
value 類物件的建立,value類中只有乙個帶參建構函式,編譯器不會為其新增無參建構函式,所以此處的無參物件會建立失敗
類成員變數只能用初始化列表進行初始化
實驗3:const唯讀成員變數的初始化和修改
實驗1:類中是否可以存在const成員,可以的話該怎麼初始化
隨筆:剛開始學到這裡,我沒懂老師為什麼會提出這個問題,我剛開始認為,肯定可以定義啊,但是沒有深入思考,怎麼初始化。後面想了想才反應過來,我們之前所學習的const識別符號在定義的時候就會進行初始化,如 const int c = 0; 此時 c就是乙個常量,後面不能出現在賦值符號左邊,但是在類中,我們定義成員變數需要在定義物件的時候可進行設定初始值,不能在類中初始化,所以就會出現這樣的情形,const int ci; 定義了乙個唯讀變數,以我們之前學習的知識,後面就沒辦法對ci進行初始化了,因為無論如何 ci 都不能出現在賦值符號的左邊。所以由這個例子就引出了 const 識別符號的初始化問題,該怎麼初始化 類中的const成員變數。
#include class test
int getci()
};int main()
mhr@ubuntu:~/work/c++$ g++ 20-1.cpp
20-1.cpp: in constructor 『test::test()』:
20-1.cpp:8:5: error: uninitialized const member in 『const int』 [-fpermissive]
test()
^20-1.cpp:6:15: note: 『const int test::ci』 should be initialized
const int ci;
^20-1.cpp:10:12: error: assignment of read-only member 『test::ci』
ci = 10;
^mhr@ubuntu:~/work/c++$
分析:
提示第8行 test() 未初始化 const 成員變數
提示第10行 ci = 10; const 成員變數不能出現在賦值符號左邊
實驗2:初始化列表的使用
實驗2.1 :value 類物件的建立,value類中只有乙個帶參建構函式,編譯器不會為其新增無參建構函式,所以此處的無參物件會建立失敗
#include class value
int geti()
};class test
};int main()
mhr@ubuntu:~/work/c++$ g++ 20-2.cpp
20-2.cpp: in constructor 『test::test()』:
20-2.cpp:27:5: error: no matching function for call to 『value::value()』
int geti()
};class test
};int main()
mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$ g++ 20-2.cpp
mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$ ./a.out
i = 2
i = 3
i = 1
test::test()
mhr@ubuntu:~/work/c++$
結果證明 成員變數的初始化,必須通過初始化列表來完成。並且成員的初始化順序與成員的宣告順序相同,與初始化列表中的位置無關,而且初始化列表先於建構函式函式體執行。
注意區分 初始化列表和建構函式,建構函式是用於對物件的初始化,如果不用建構函式對物件初始化,物件的成員變數的值是未知的。也可以在建構函式中對成員變數進行賦值,但是那並不是初始化,是賦值!!
const成員的分配的空間是和類物件所分配的空間一致的,如果當前物件是在棧上分配的空間,那麼const 成員就是在棧上分配空間。。。。
編譯器無法直接得到const成員的初始值,因此無法進入符號表成為真正以意義上的常量。
解析:初始化列表是用於初始化成員變數的,對於const成員變數而言,變數的建立 和 初始化在視覺上是分開的,並不是類似於 const int a=1; 這種寫法,所以編譯器無法直接確定const識別符號的初始值,所以無法進入符號表成為真正意義上的常量,只能是唯讀變數
實驗3:const唯讀成員變數的初始化和修改
第20課 初始化列表的使用
類中是否可以定義const成員?下面的類定義是否合法?如果合法,ci 的值是什麼,儲存在 1 class test 27 1 include 2 3class test412 intgetci 1316 17 1819 intmain 20類中的const成員 在c中 const 修飾的變數必須在定...
第20課 初始化列表的使用
類中是否可以定義const成員?下面的類定義是否合法?如果合法,ci 的值是什麼,儲存在 1 class test 27 1 include 2 3class test412 intgetci 1316 17 1819 intmain 20類中的const成員 在c中 const 修飾的變數必須在定...
20 初始化列表的使用
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 問題 類中是否可以定義const成員?類中可以巨集定義const成員變數,只能通過成員列表進行初始化。二 小實驗 1 下面的類定義是否合法?如果合法,ci的值是什麼,存在在...