前面介紹了什麼是變數,以及變數的命名與定義,現在我們來了解一下變數的初始化。
我們都知道,在定義乙個變數時,需要明確它的型別和變數名,其實,有時候我們也要為變數設定乙個初始值。這樣在變數定義時就已被賦值的變數,就是初始化的變數,這個賦值操作稱為初始化。
c++語言支援兩種初始化的格式:copy-initialization(複製初始化)和direct-initialization(直接初始化)。複製初始化在語句中使用等號;直接初始化則將初始值寫在小括號內。如下,為ival賦值1024:
int ival(1024); //direct-initialization
int ival=1024; //copy-initialization
在c++程式的編寫中,直接初始化比複製初始化的使用要更加靈活。
很多人將變數的初始化看做賦值的一種,但是在c++中這是兩個不同的操作符(原書觀點)。在其他的語言中,這種區別是很少見的,並且是可以不考慮的。儘管這樣,在c++中也要很複雜的程式編寫中才會體現出初始化和賦值的區別。
多重初始化程式的應用
當我們初始化乙個內建資料型別的變數時,我們要做的只有:提供乙個值,別且把這個值複製到被定義的變數中。對於內建資料型別的變數,直接初始化和複製初始化只有很小的區別。但是,對於類型別的變數,我們只能用直接初始化的方式來進行變數的初始化。為了理解這點,我們需要先了解下類對於初始化操作的控制。
每乙個類都是由乙個或者多個元函式(成員函式)組成,這些元函式恰恰影響了類型別變數的初始化。這些決定類型別變數初始化的元函式通常稱為建構函式(constructor)。像其他的函式一樣,建構函式也擁有很多的引數(argument)。每個類都會定義一些建構函式,這些建構函式必須包含不同數目或者型別的引數。下面我們來簡單看看string類以便於我們理解。
string類是定義成庫函式並且可以作用於變化長度的字串的類。為了使用string類,我們必須include這個類的標題,像io型別,string類是定義在std的命名空間的。
sting類定義了一些建構函式,這給了我們很多途徑去初始化string。其中一種就如複製乙個字串常量:
#include // alternative ways to initialize string from a character string literal
std::string titlea="c++ primer, 4th ed.";
std::string titleb("c++ primer, 4th ed.");
在這個例子中,兩種初始化操作都是合法的,它們都建立了乙個初始值是特定字串常量的sting變數。不僅僅是常量,我們也可以通過數量和字元來初始化sting,這樣做可以建立乙個包含重複一定數量的字元的string:
std::string all_nines(10, '9'); //all_nines="9999999999"
在這個例子中,我們只能通過直接初始化來初始化all_nines,用複製初始化來進行多重初始化程式的操作。
初始化多個變數
如同定義乙個一樣,在定義多個變數時,每個變數一般都有其自己的初始化程式。在定義變數的時候,變數名的後面加上初始化的變數值,使得這個變數更加直觀。在命名語句中,可能同時存在初始化的和非初始化的變數,而且複製初始化和直接初始化可以混合使用。如下:
#include double salary=9999.99,
wage(salary+0.01);
int interval,
month=8, day=7, year=1995;
std::string title ("c++ primer, 4th ed."),
publisher="a-w";
任何表示式都可以用作變數的初始化,包括函式的返回值。如下:
double price=109.99, discount=0.16;
變數的初始化潛規則
在定義乙個變數時,如果我們沒有進行初始化操作,系統有時候會幫我們完成初始化。至於初始化的值,主要取決於變數的型別以及被定義的位置。
不管怎樣,在函式外定義的變數都被初始化為0。而如果是在函式體內定義的內建型變數,通常是未初始化的。把任何未初始化變數當做左值來使用的賦值行為都是未定義的行為,隨之引起的錯誤很難被發現。所以這種未定義的行為實不可取的。
類型別變數的初始化
每個類都會定義它的物件的初始化方式,它通過定義不同的建構函式來控制變數的初始化。例如,在string類中至少有兩個建構函式,乙個使我們可以初始化為字串常量,另乙個使我們可以初始化為字元或者是數量。
類同樣定義了初始化程式對於被定義的變數型別不可用的結果,這是通過定義預設建構函式(default constructor)來實現的。之所以稱為預設建構函式,是因為當變數沒有被初始化的時候,這個函式是預設執行的,而且不管這個變數是在**被定義的。
很多的類都會定義預設建構函式,如果乙個類定義了預設建構函式的話,我們有時就不需要一對一的對變數進行初始化操作。例如,string型別定義了乙個預設建構函式,使得「string」稱為乙個空的字串常量:
std::string empty; //empty is the empty string; empty=""
對於那些沒有定義預設建構函式的類,我們必須針對每個變數進行初始化操作。 C 初始化變數
1.初始化變數 int i1 7.2 正確,但是i1的值變為了7 int i 建議使用初始值列表 int i2 錯誤 初始值列表確保不會發生某些可能導致資訊丟失的型別轉換 int i3 錯誤 同上,且 是多餘的 2.使用auto關鍵字 struct record auto p new record ...
C 的變數初始化
c 中變數的初始化有很多種方式,如 預設初始化,值初始化,直接初始化,拷貝初始化,列表初始化。1 預設初始化 預設初始化是指定義變數時沒有指定初值時進行的初始化操作。如 int a 這些變數被定義了而沒有顯式的賦予初值。特別的,採用動態分配記憶體的方式 即採用new關鍵字 建立的變數,不加括號時 如...
C 的變數初始化
c 中變數的初始化有很多種方式,如 預設初始化,值初始化,直接初始化,拷貝初始化,列表初始化。1 預設初始化 預設初始化是指定義變數時沒有指定初值時進行的初始化操作。如 int a 這些變數被定義了而沒有顯式的賦予初值。特別的,採用動態分配記憶體的方式 即採用new關鍵字 建立的變數,不加括號時 如...