C 第二章(資料型別)之三

2021-04-01 02:45:51 字數 2646 閱讀 8014

引用型別

引用reference, 有時候又稱為別名(alias)。 它可以用作物件的另乙個名字.通過引用,我們可以間接地操縱物件.其使用方式類似於指標,但是不需要指標的語法.在實際的程式中,引用主要被用作函式的形式引數——通常將類物件,傳遞給乙個函式.這個特性最主要的是在函式中用來傳遞乙個類的引用,見類的拷貝建構函式.

引用就是原來物件的別名,對引用操作就是對原來物件本身操作,就象某人叫朱軍,小名是三毛,讓小毛做某些事情就是讓朱軍做些事情.引用的位址就是他所代表變數的位址。

引用應用

1、引用作為引數

引用的乙個重要作用就是作為函式的引數。以前的c語言中函式引數傳遞是值傳遞,如果有大塊資料作為引數傳遞的時候,採用的方案往往是指標,因為這樣可以避免將整塊資料全部壓棧,可以提高程式的效率。但是現在(c++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。

#include

using namespace std;

int main()

int main()

說明:(1)以引用返回函式值,定義函式時需要在函式名前加&

(2)用引用返回乙個函式值的最大好處是,在記憶體中不產生被返回值的副本。

【例5】以下程式中定義了乙個普通的函式fn1(它用返回值的方法返回函式值),另外乙個函式fn2,它以引用的方法返回函式值。

#include

float temp; //定義全域性變數temp

float fn1(float r); //宣告函式fn1

float &fn2(float r); //宣告函式fn2

float fn1(float r) //定義函式fn1,它以返回值的方法返回函式值

float &fn2(float r) //定義函式fn2,它以引用方式返回函式值

void main() //主函式

} (5)在另外的一些操作符中,卻千萬不能返回引用:+-*/ 四則運算符。它們不能返回引用,effective c++[1]的item23詳細的討論了這個問題。主要原因是這四個操作符沒有side effect,因此,它們必須構造乙個物件作為返回值,可選的方案包括:返回乙個物件、返回乙個區域性變數的引用,返回乙個new分配的物件的引用、返回乙個靜態物件引用。根據前面提到的引用作為返回值的三個規則,第2、3兩個方案都被否決了。靜態物件的引用又因為((a+b) == (c+d))會永遠為true而導致錯誤。所以可選的只剩下返回乙個物件了。

4、引用和多型

引用是除指標外另乙個可以產生多型效果的手段。這意味著,乙個基類的引用可以指向它的派生類例項。

【例7】:

class  a;

class  b:public a;

b  b;

a  &ref = b; // 用派生類物件初始化基類物件的引用

ref 只能用來訪問派生類物件中從基類繼承下來的成員,是基類引用指向派生類。如果a類中定義有虛函式,並且在b類中重寫了這個虛函式,就可以通過ref產生多型效果。

引用總結

還有乙個問題就是:引用定義的時候必須初始化,因為他本來就是乙個代號,它建立的時候必須代表什麼,否則他的存在就沒有意義.

int ival = 1024;

// ok: refval 是乙個指向ival 的引用

int &refval = ival;

// 錯誤引用必須被初始化為指向乙個物件

int &refval2;

(1)在引用的使用中,單純給某個變數取個別名是毫無意義的,引用的目的主要用於在函式引數傳遞中,解決大塊資料或物件的傳遞效率和空間不如意的問題。

(2)用引用傳遞函式的引數,能保證引數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。

(3)引用與指標的區別是,指標通過某個指標變數指向乙個物件後,對它所指向的變數間接操作。程式中使用指標,程式的可讀性差;而引用本身就是目標變數的別名,對引用的操作就是對目標變數的操作。

(4)使用引用的時機。流操作符《和》、賦值操作符=的返回值、拷貝建構函式的引數、賦值操作符=的引數、其它情況都推薦使用引用。

布林型別

布林型別物件可以被賦以文字值true或false。                     //true或false是c++的關鍵字

當表示式需要乙個算數值時,布林物件(如found)和布林文字都被隱式的提公升為int:false變成0,而true變成1。

bool found = false;

int occurrence_count = 0;

while ( /* 條件省略 */ )

;const 資料成員的初始化只能在類建構函式的初始化表中進行,例如

class a

;a::a(int size) : size(size) // 建構函式的初始化表

a a(100); // 物件 a 的size 值為100

a b(200); // 物件 b 的size 值為200

怎樣才能建立在整個類中都恆定的常量呢?別指望const 資料成員了,應該用類中

的列舉常量來實現。例如

class a

; // 列舉常量

int array1[size1];

int array2[size2];

};列舉型別(enumeration)

我們在寫程式的時候,常常需要定義一組與類相關的屬性。//與物件相關的屬性可以用const來說明。

第二章 資料型別

1byte 8bit 1kb 1024byte 1mb 1024kb 1gb 1024mb 1tb 1024gb intfloat 用float計算精度會不準確,需要匯入decimal模組 strbool true,false int 可以將整數型的str和float,bool轉換成int str ...

第二章 深入C 資料型別

資料型別按儲存方式可分為兩類 值型別 源於system.valuetype 引用型別 源於system.object 結構的定義 結構中可以有字段也可以有方法 定義時,結構中的字段不能被賦初值 結構的使用 可以不用new,直接定義結構的物件即可 前提該屬性的型別不是數值型別 宣告結構的物件後,必須給...

Python第二章資料型別

基本資料型別 python 中的變數不需要宣告。每個變數在使用前都必須賦值,變數賦值 以後該變數才會被建立。python 中,變數就是變數,它沒有型別,我們所說的 型別 是變數所指的記憶體中物件的型別。等號 用來給變數賦值。等號 運算子左邊是乙個變數名,等號 運算子右邊是儲存在變數中的值。例如 x ...