引用,是變數的別名,就是你自己有個名字,比如李四,那你還有另外乙個小名,叫小四,小四就是你的別名,別人叫你的時候你就會答應,那麼李四和小四是同乙個人,那麼某個變數的引用是一樣的,對該引用的操作就是對原變數的操作,本身不占用儲存單元,也不是乙個新的資料型別。(不能建立陣列的引用)
引用在函式傳參時的特點:
1. 不需要產生副本(一般的函式傳遞,eg:void func(int a),形參變數是實參變數的副本,如果傳遞的是物件的話,會呼叫複製建構函式),節省了記憶體空間;
2. 在被調函式func中對形參a的操作就是對實參變數的操作,直接更改實參變數;
3.可讀性好,不用像指標那樣*指標變數名。
順便說一下引用和指標的區別和聯絡:
1. 對二者的操作均可以改變原變數;
2.引用不是乙個資料型別,只是變數的別名,指標是一種資料型別,占用儲存單元;
3.引用的可讀性好,指標需要取變數符*。
常引用:
string foo( );
void bar(string & s);
那麼下面的表示式將是非法的:
bar(foo( ));
bar("hello world");
原因是:foo( )函式返回乙個string型別的臨時物件,這個物件是const型的,而bar()函式接收的是乙個string型別的引用,但並不是常量,那麼就是將const型別轉換成非const型別,會報錯, bar("hello world")也一樣,會產生乙個臨時物件,這個物件同樣是const型別的,bar函式定義為void bar(const string & s)就不會報錯了。
引用使用的幾點注意事項:
1. 不能返回區域性變數的引用。因為區域性變數在函式返回後會自動銷毀,那麼對應的引用就沒有了指向,程式進入未知狀態;
2. 不能返回new分配的記憶體空間的引用。因為如果該引用沒有賦給乙個實際變數,只是乙個臨時的變數的話,那麼該引用所指向的儲存空間就無法釋放;
3. 當返回類成員的引用時,最好是const,因為物件的屬性之間很可能有相關性;
4. 流操作過載運算子返回宣告為引用,因為《和》常常被連續使用,如果返回的是物件或者物件指標時,程式會構造乙個新的流物件,兩個連續的《指向的是不同物件的,所以必須返回引用。eg:(x=10)=100,如果x=10返回的是乙個變數的話,那麼100就賦給了這個臨時變數,而不是x。
5. :+-*/ 四則運算符不能返回引用,因為他們不會產生***(表示式有兩種功能:每個表示式都產生乙個值( value ),同時可能包含***( side effect )。***是指改變了某些變數的值。),所以要返回乙個物件,用這個物件去改變某些變數的值。
靜態的特點以及注意事項
static方法是類中的乙個成員方法,屬於整個類,即使不用建立任何物件也可以直接呼叫 優先於物件存在,被所有物件所共享 靜態方法 效率上要比例項化高,靜態方法 的缺點是不自動進行銷毀,而例項化的則可以做銷毀。靜態會隨著類的消失而消失,說明他的生命週期最長 1 靜態方法只能訪問靜態成員 2 靜態方法中...
Python中各種容器的特點和注意事項
python3中的序列型別 1.字串 str 2.列表 list 3.元組 tuple 4.位元組串 5.位元組陣列 字串 字串是不可變的序列 列表 列表是可變的,可以通過索引賦值,改變列表中的元素 元組 元組是不可變的序列 在這裡,特別提一下元組的建立方式 t 200,特別注意 不要忘記加逗號,t...
windows引用MFC函式注意事項
1 在專案屬性中修改 在共享 dll 中使用 mfc 2 winmain定義形式要和mfc入口函式 twinmain 一樣 如以下程式欲使用mfc的trace0函式。include include include pragma warning disable 4996 去除 vsntprintf不安...