1. 程式人生 > >C++系列——const,引用,指標用法小結

C++系列——const,引用,指標用法小結

1. const

將變數設定為只讀,任何對其進行的寫操作(如賦值),都會導致編譯錯誤。

2. 引用

引用(複合型別)就是物件的另外一個名字。

關於定義引用幾點要求:

a. 定義引用的時候,必須初始化(指定引用指向物件的唯一方法)。非法情況:int &ref;

b. 初始化引用的時候,必須是一個其他型別的物件。非法情況:int &ref=10;

c. 正確形式:int val = 10; int &ref = val; (接下來,ref就是val的外號了,而且是從一而終,可以說val和ref就是你中有我,我中有你了^ ^。p.s. 多麼純粹而和諧的關係呀!)

d. 非const引用只能繫結到與該引用同類型的物件;const引用則可以繫結到不同但相關型別的物件。

eg. double dval = 3.14; 
    const int &ref = dval; //合法 (編譯器會自動生成一箇中間變數:int temp = dval; const int &ref = temp;)
    int &ref2 = dval; //不合法

3. 指標和const

(指向const物件的指標 & const指標)

[指向const物件的指標]

定義方式:

const int * ptr;// int const * ptr 表示同樣的意思(指向常量整形的指標ptr)

“自以為指向const物件的指標”:自以為,說的是該指標可以指向const物件,也可以不指向const物件。但是有一點是明確的,不管指向的是不是const物件,都不能通過該指標來試圖改變所指向的物件。

為什麼這麼設計呢?

1. c++強制要求指向const物件的指標必須具有const特性。也就是說這裡的const限定的是該指標所指向物件的型別,而並非指標本身,也就說是說該指標指向的物件是可以改變的。

2. 因為編譯器並不能確定指向const物件的指標,指向的到底是不是一個const物件,所以統一按照const物件來處理。

[const指標]

定義方式:

int val = 9;
int *const ptr = & val;
"“本身是const型別的指標”:指標本身的值(代表的地址)不能被修改,也即,指標不能指向其他型別的物件。所以必須在定義時必須初始化!

注:以上二種可以組合起來,構成指向const物件的const指標(const int * const ptr = &val;)。具體意思,看懂上面的,同理推之即可知。

4. typedef和指標

typedef string *pstring;
const pstring cstr;
cstr表示的是什麼意思呢?
答案:指向string型別物件的const指標。

說明:pstring 表示的是指向string型別物件的指標,這裡const修飾的這個指標,指定該指標是const型別。

易錯:認為翻譯過來應該是 const string *cstr,所以認為是指向const型別的string物件。這樣子是把typedef表示式當作文字擴充套件而進行直譯了。

5. 指標和引用的區別

指標和引用的區別:

1. 指標指向的物件可以改變,可以指向空;引用則只能指向一個物件,並在初始化的時候就已經指定好了,而且必須在初始化的時候指定。

2. 引用可以看成是被限制使用了的指標,因為對引用的改變也會改變引用所指向的物件。


應用場景:

1. 引用可以起到資訊保護的作用,防止引用指向不同的物件。

2. 引用的效率更高,因為引用不能指向空,所以在使用時一般不用對引用進行空值判斷;而指標則一般需要進行空值判斷。

相關推薦

C++中const引用指標之間的關係要點

一、const關鍵字 1、有時我們希望定義這樣的一個變數,它的值不能被改變。這時就可以在定義變數時加上const關鍵字。例如 const int bufSize=512; const型別變數可以進行大部分與非const型別變數相同操作,主要的限制就是不可以在const型別的物件上執

C++系列——const引用指標用法小結

1. const 將變數設定為只讀,任何對其進行的寫操作(如賦值),都會導致編譯錯誤。 2. 引用 引用(複合型別)就是物件的另外一個名字。 關於定義引用幾點要求: a. 定義引用的時候,必須初始化(指定引用指向物件的唯一方法)。非法情況:int &ref;

9. c++中的const引用指標

const常量的判別標準 只有用字面量初始化的const常量才會進入符號表 使用其他變數初始化的const常量仍然是隻讀變數 被volatie 修飾const常量不會進入符號表 在編譯期間不能確定初始值的const識別符號,都被作為只讀變數處

c++中什麼是引用什麼是指標

引用就是引用地址,給變數取個小名,這個都可以改變變數的數值。 程式碼: #include <iostream>   using namespace std;   int main () {    // 宣告簡單的變數   &n

C++指標引用引用作為函式的引數

引用作為函式引數 在函式體內修改引數的值,實參可變 形參可變 實參只能是變數 不會產生實參值的拷貝(效能好) 常引用作為函式引數 實參不會變 形參不可變 實參可以是變數

指標引用*與&

當定義一個普通的一個指標時例如:int *num; int num1; num=&num1;此處&起的是取地址作用。 這種方式可以用到函式: int main() {int a=10;int b=15;test(&a,&b);printf("a=%d,b=

函式返回指標引用指標區別

1,函式不可以返回棧記憶體的指標,但是可以返回堆記憶體的指標,可以free掉兩次指向空的指標,但是不能連續free兩次指向記憶體的指標,會產生已放棄   int main() { int *a; a = (int *)malloc(10); a[0] = 1

C以及C++在const的區別以及constC++的增強

C語言中const是一個偽常量,可以通過指標間接賦值改變,在C++中const得到加強,定義的是真常量。 const int a = 3;const int b = 4;int array[a + b] = { 0 };以上語句在C語言報錯,在C++中通過,即可說明真偽常量

數組引用指針那些事

註意 首地址 編譯器 編譯 拷貝 避免 ons 現在 void 數組、指針、引用三者夾雜不清,寫法很容易讓人記憶混淆,現在做如下總結: 數組的引用和引用的數組 C++中由於數組不允許拷貝和賦值,當我們函數形參設為數組時,編譯器會自動將數組形參轉換為

C#系列 ----- 3 值引用和物件引用

值型別和引用型別(Value Types Versus Reference Types) 上一篇對於type的定義其實不準確,在此給出更準確的定義。 所有的C#型別包括: Value types Reference types Generic type par

C語言const關鍵字的四種用法

#include <stdio.h> /* gcc中,const是通過編譯器在編譯的時候執行檢查來確保實現的(也就是 說const型別的變數不能改是編譯錯誤,不是執行時錯誤。)所以

預設引數函式過載引用行內函數...

目錄 預設引數 (預設引數) 函式過載 引用 常引用 行內函數 基於範圍的for迴圈 指標空值---nullptr 預設引數 (預設引數)          定義:指當函式呼叫中省略了實引數時自動使用的一個值。

c語言常見的幾種指標用法

 1、指標指向變數: 下面有這樣一個程式碼塊: #include <stdio.h> void test(int x,int y) { int tmp; tmp=x; x=y; y=tmp; } int main() { int a=10; int

iOS 底層解析weak的實現原理(包含weak物件的初始化引用釋放的分析)

很少有人知道weak表其實是一個hash(雜湊)表,Key是所指物件的地址,Value是weak指標的地址陣列。更多人的人只是知道weak是弱引用,所引用物件的計數器不會加一,並在引用物件被釋放的時候自動被設定為nil。通常用於解決迴圈引用問題。但現在單知道這些已經不足以應

c++中普通變數引用變數 指標變數用例項讓你親自體會

int a1 = 10; int a2 = 20; int a3 = a1;//賦值語句,可以理解成資料的克隆,a3與a1 不在是指向一個物件 int &b = a1; //int &b2 = 900; //不合法,非常量引用的初始值必須左值 int *c =

c++中的常量常物件引用指標

   所謂常量是指在程式執行中值始終不可改變的量。而常物件是指他的資料成員在物件的整個生存週期內不能改變。這也意味著不能用常物件去呼叫普通的成員函式,因為有可能會改變常物件的資料成員,所以便有了常成員函式。如果一個物件被宣告為常物件,他只能呼叫常成員函式。普通物件也能呼叫常成員函式

C#:索引器用法、集合(動態陣列堆疊佇列雜湊表)用法指標(fixed關鍵字)用法

1.索引器用法   http://www.runoob.com/csharp/csharp-indexer.html 2.集合用法   http://www.runoob.com/csharp/csharp-collection.html 3.指標用法

C++學習之如何理解*&指標引用

指標大家都知道啦, 然後你需要知道指標的指標 如int **p; 將指標的指標分層理解: int *(*p);括號內的整體表示一個指向int型別的指標物件,這時*p中的p自然就是指向指標的指標了。 接下來看int *&p; 也來分層理解,表示為  int *(&

c++ 11中emplace_back替代push_back的相關知識點含右值引用move用法

C++11引入了右值引用,轉移建構函式,push_back()右值時就會呼叫建構函式和轉移建構函式(原來是呼叫拷貝構造,會為臨時變數申請堆空間,影響程式效率,C++11以後為右值引用呼叫轉移建構函式,不會為臨時變數申請堆空間,而是直接賦值,提高程式效率)。 使用mplace_back替代push_back()

C++中函式引數傳遞(值傳遞、指標傳遞引用傳遞)

今天想寫一個函式,從函式中把我需要的兩個值傳出來,由於傳出來的值比較多,所以不考慮用return來返回,需要通過引數把修改後的值拉出來供我使用,很當然的就想到了用指標,但是值就是傳不出來;使我對原有的大腦中指標的思維產生混沌感,今天一上午才把函式傳遞又走了