C 第20課 初始化列表的使用

2021-10-02 10:02:15 字數 3264 閱讀 9474

本文學習自 狄泰軟體學院 唐佐林老師的 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的值是什麼,存在在...