string 類的模擬實現
一 .建構函式使用初始化列表的優點
建構函式的執行分為兩個階段:初始化階段和計算階段,初始化階段先於計算階段(賦值語句)。
在使用建構函式給資料成員進行初始化時通常有兩種選擇。一是在建構函式後加上冒號,並用初始化列表的方式對成員進行初始化。二是在建構函式體中用賦值語句完成對成員的初始化。這兩者的細微差別在於,使用初始化列表的方式初始化成員時,成員在宣告之後立即被賦予初值,不需要呼叫其他的賦值語句;而在函式體內對成員的的初始化是在宣告變數之後使用賦值語句對變數進行賦值處理,從而達到初始化的目的。這兩種初始化方式都能給成員賦值,但是在一些特殊情況下,只能選擇初始化列表對成員進行初始化。
一般來說,有以下三種情況必須使用初始化列表的方式進行資料初始化
1. 當類的資料成員中含有引用成員時
2. 當類的資料成員中含有常量成員時
3. 類中含有另乙個類的物件,而這個物件的類沒有預設建構函式
對於1,2:引用和常量的自身性質決定了在建構函式只能使用初始化列表的方式對其進行初始化。
引用: 在宣告引用時,必須同時對它進行初始化,不能宣告完成之後再賦值。引用一旦初始化之後,不能再被改變。(建立引用的作用是為變數起另乙個名字,其本質是變數的別名。不分配新的記憶體空間,和原變數使用同乙個記憶體空間,對引用的改變就是對變數的改變。)對於3:常量: 不接受宣告之後的賦值,只能初始化,不能賦值。
若test1類中沒有預設建構函式,test1類的物件是test2類的成員,
那麼在test2中定義無參物件時,系統會顯示
編譯錯誤。這種情況下,需要使用初始化
列表對其進行初始化,因為使用初始化列表初始化物件時,系統會跳過
建構函式,直接進入拷貝建構函式。
使用初始化列表的優點: 減少呼叫建構函式的次數,能應對缺少預設建構函式的情況,以及適用於一些特定情況。
二 .const 常型別
原因: 程式中各種形式的資料共享在不同程度上破壞了資料的安全性。
目的: 為了既保證資料共享又防止資料在共享過程中被改變,c++引入了常型別。
優點: 使用常型別修飾的變數在程式執行期間的值是不可改變的,保證了資料的安全性。
使用分類:
1. 常引用(說明引用時用const修飾)
const 型別 & 引用名;
int a=5;
const int & b=a; //宣告引用的同時對其初始化,b 是乙個常引用,它所引用的物件不可更改。
* 常引用做函式引數能夠避免對實參的修改,保證了資料的安全。
2. const int *p ; // 被指物是常量,不能改變被指位址內的內容,但能改變指標的指向。
3. int * const p ; // 指標p為常量指標,不能改變指標的指向,但能改變指標指向位址內的內容。
4. const 和 define 的區別:define 為巨集替換,只進行簡單的替換操作,不進行相關的語法檢查。
const 進行語法檢查。
記憶體分配。避免了不必要的記憶體分配,節省了記憶體空間。
三. 引用作為返回值的優點
1. 對於普通函式來說,函式結束後,系統要生成返回值的副本(拷貝),而對於返回值為引用的函式來說,
最終返回的是返回值的引用,系統沒有生成副本,減少了資源浪費。
2. 引用作為返回值可以將函式呼叫放在賦值運算子的左邊。
3. 引用作為函式返回值時,返回的物件不能是區域性變數。因為區域性變數在函式結束後就會被釋放,此時的引用
將無任何意義。
模擬實現string類
include using namespace std include class string string string a 2 為什麼要用 優點在哪 string void print string operator const string a string operator const s...
模擬實現string類
在c 中,string其實就是將字串封裝起來的類,呼叫類中的成員函式可以完成對類內的字串進行增刪查改,並且將操作符過載,可以更直觀的操作字串,省去了c語言中很多麻煩的操作,有現成的成員函式供我們使用。舉乙個簡單的例子 在c語言中要在一串字串的尾部拼接另乙個字串,我們需要做的事情就是定義兩個字串,要使...
string類模擬實現
define crt secure no warnings include include using namespace std class string iterator end const iterator begin const const iterator end const 無參建構函式...