1. 程式人生 > >c++ primer之變數與基本型別

c++ primer之變數與基本型別

如果表示式裡既有帶符號型別又有無符號型別,當帶符號型別取值為負時會出現異常結果。因為帶符號數會自動轉換成無符號數。

unsigned u=10;
int i=-42;
std::cout<<i+i<<std::endl;//輸出-84
std::cout<<u+i<<std::endl;//如果int佔32位,輸出4294967264

引用與指標:

引用並非物件,引用只是為一個已經存在的物件所起的另外一個名字。

指標本身就是一個物件,允許對指標賦值和拷貝,而且在指標的生命週期內它可以先後指向不同的物件。

指標無需再定義時賦初值。但是在塊作用域定義內的指標一定要初始化。

利用相等操作符(==)或!=操作符比較指標時,比較的是兩個指標存放的地址值。

指向指標的引用:

引用本身不是一個物件,因此不能定義指向引用的指標。但指標是物件,所以存在對指標的引用。

int i=42;
int *p=0;//p是一個int型指標
int *&r=p;//r是一個對指標p的引用
r=&i;//令p指向i
*r=0;//令解引用r得到i,i=0;

面對一條比較複雜的指標或引用的宣告語句時,從右到左閱讀有助於弄清楚它的真實含義

const的引用:

常量引用僅對引用可參與的操作做出了限定,對引用的物件本身是不是一個常量未作限定

const的指標:

指向常量的指標不能用於改變其所指物件的值。要想存放常量物件的地址,只能使用指向常量的指標。

const double pi=3.14;//pi是一個常量,值不能被改變
double *ptr=&pi;//錯誤,ptr是一個普通的指標
const double *cptr=&pi;//指向常量的指標指向一個常量物件
*ptr=42;//錯誤,不能給*ptr賦值
double dval=3.14;
cptr=&dval;//正確,見note.

Note: 指向常量的指標沒有規定其所指物件必須是一個常量。所謂指向常量的指標僅僅要求不能通過該指標改變物件的值,而沒有規定那個物件的值不能通過其他途徑改變。

const指標

常量指標表示指標本身是一個常量,其必須初始化,而且一旦初始化完成,則它的值,也就是存放在指標中的那個地址就不能再改變。表示為* const,不變的是指標本身的值,而非指向的那個值。

int errNumb=0;
int *const currErr=&errNumb;//currErr一直指向errNumb
const double pi=3.14159;
const double *const pip=&pi;//pip是一個指向常量物件的常量指標
*pip=2.172;//不能通過指標修改物件的值,因指向常量物件
*curErr=0;//可以把curErr指標指向的物件重置,因其指向非常量物件。

頂層const表示指標本身是一個常量。

底層const表示指標所指物件是一個常量。

int i=0;
int *const p1=&i;//頂層const
const int ci=42;//頂層const
const int *p2=&ci;//底層const

當執行物件的拷貝操作時,常量是頂層const還是底層const區別明顯。

頂層const不受什麼影響。

i=ci;//正確
p2=p3;//正確

當執行物件的拷貝操作時,拷入和拷出物件必須具有相同的底層const資格,或者兩個物件的資料型別必須能夠轉換。

int *p=p3;//錯誤,p3包含底層const的定義,而p沒有
p2=p3;//正確
p2=&i;//正確,int*能轉化成const int*
int &r=ci;//錯誤,普通的int&不能繫結到int常量上
const int &r2=i;//正確:const int&可以繫結到普通的int

constexpr和常量表達式:

常量表達式是值不會改變並且在編譯過程就能得到計算結果的表示式。

我們允許將變數宣告為constexpr型別以便由編譯器來驗證變數的值是否是一個常量表達式。宣告為constexpr的變數一定是一個常量,而且必須用常量表達式初始化。

在constexpr宣告中如果定義一個指標,限定符constexpr僅對指標有效,與指標所指的物件無關。

const int *p=nullptr;//p是一個指向整型常量的指標
constexpr int *q=nullptr;//q是一個指向整數的常量指標

需要注意的是,const是給定型別的修飾。當使用類型別名的時候,類型別名就是一個型別。

typedef char *pstring;//pstring是char*
const pstring cstr=0;//cstr是指向char的常量指標
const pstring *ps;//ps是一個指標,它的物件是指向char的常量指標

C++11新標準引入了auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別。

(1)推斷引用時,編譯器以引用物件的型別作為auto的型別。

(2)auto 一般會忽略掉頂層const,同時底層const則會保留下來。

(3)如果我們希望推斷出的auto型別是一個頂層const,需要顯式指出。

decltype型別指示符:選擇並返回運算元的資料型別。

decltype(f()) sum=x;//sum的型別就是函式f的返回型別。編譯器分析表示式並得到它的型別,卻不實際計算表示式的值

如果decltype使用的表示式是一個變數,則decltype返回該變數的型別(包括頂層const和引用在內)。

const int ci=0,&cj=ci;
decltype(ci) x=0;//x的型別是const int
decltype(cj) y=x;//y的型別是const int&,y繫結到變數x
decltype(cj) z;//錯誤,z是一個引用,必須初始化。

如果decltype使用的表示式不是一個變數,則decltype返回表示式結果對應的型別。

int i=42,*p=&i,&r=i;
decltype(r+0) b;//正確:加法的結果是int,因此b是一個(未初始化的)int
decltype(*p) c;//錯誤,c是int&,必須初始化。如果表示式的內容是解引用操作,則decltype將得到引用型別。

decltype((variable)) (注意是雙層括號)的結果永遠是引用,而decltype(variable)結果只有當variable本身就是一個引用時才是引用。

decltype((i)) d;//錯誤:d是int &,必須初始化
decltype(i) e;//正確:e是一個(未初始化的)int

相關推薦

c++ primer變數基本型別

如果表示式裡既有帶符號型別又有無符號型別,當帶符號型別取值為負時會出現異常結果。因為帶符號數會自動轉換成無符號數。 unsigned u=10; int i=-42; std::cout<<i+i<<std::endl;//輸出-8

Java學習筆記——變數資料型別

一、變數 1.變數:變化的值 變數在程式碼執行期間,開闢了一塊空間 。這塊空間是有地址的,給這塊取了個名字, 這個名字就叫做變數名,這塊空間放的東西叫做變數值   2.變數的初始化: (1)先宣告再賦值: ***宣告變數:資料型別 變數名*** 宣告:int i; 賦值:i=1;

C++ 學習筆記 變數基本型別(一)

C++ 學習筆記 一、變數和基本型別概述 型別是所有程式的基礎。型別告訴我們資料代表什麼意思以及可以對資料執行哪些操作。 c++基本型別: 字元型 整型 浮點型 c++ 還提供了可用於自定義資料型別的機制,標準庫正式利用了這些機制定義了許多更復雜的型別,比如可變長字串string 和vector等。此外,

C++ PRIMER3 標準庫型別

1 using 宣告 一次只能用於一個名稱空間 儘量不要在標頭檔案中使用 2 string 型別 #include<string> 構造: string s1("test") s2(n, 'c') getline 獲取一行 直到換行符 重要操作: empty

c++primer第二章變數基本型別

2.1 基本內建型別 2.1.1算術型別 算術型別分兩類:整型(integral type)和浮點型。 算術型別的尺寸在不同機器上有所差別。某一類所佔的位元數不同,它所能表示的資料範圍也不樣。 型別 最小尺寸

C++ Primer》讀書筆記-第二章 變數基本型別

   第一篇文章寫完後收到了很多同學的後臺留言,有鼓勵的,也有提出建議的,還有說錯別字的,每一條都一一回復了,當然提出建議的大都是說排版問題,現在已經換到MarkDown編輯器了,大家湊合著看就行了,肯定不影響閱讀了,至於錯別字的,哈哈,你懂就行。   &nbs

c++ primer 第2章 變數基本型別

幾個小問題: (1)c++語言是什麼時候檢查資料型別的?(這麼提問好像不合適,但是又不知道怎麼表達,先這樣吧) 一些語言,如smalltalk和python等,是在程式執行的時候檢查資料型別的;與之相反,c++是一種靜態資料型別語言,它的型別檢查發生在編譯時。 (2)i

C++ Primer 隨筆 Chapter 2 變數基本型別

2.1C++內建型別 C++ 算術型別 型別 含義 最小儲存空間(隨機器不同而不同) bool 布林型 --- char 字元型 8位

總結:《C++ primer》中文版——第二章 變數基本型別

2.1.基本資料型別:整型(boolean,char,int)浮點型(float(6位小數),double(10位小數),long double(10位小數)),void(1.表示函式或過程無返回值;2.構造萬能指標型別void*,表示指向型別不限或型別不可預知的物件。) float(一個字4位元組),do

C++ Primer 【第四版】第二章 變數基本型別

習題2.1 int、long 和short 型別之間有什麼差別? 【解答】 它們的最小儲存空間不同,分別為16 位、32 位和16 位。一般而言,short 型別為半個機器字(word)長,int 型別為一個機器字長,而long 型別為一個或兩個機器字長(在32 位機器

c++ primer 第五版學習筆記-第二章 變數基本型別

本文為轉載,出處:https://blog.csdn.net/libin1105/article/details/48157115                              https://blog.csdn.net/sunhero2010/article/d

C++ Primer 第二章 變數基本型別 筆記

第二章 變數和基本型別 筆記 2.1 基本內建型別 ——C++定義了一組整數、浮點數、單個字元和布林值的算術型別,另外還定義了一種稱為void的特殊型別。void型別沒有對應的值,僅用在有有限的一些

C++Primer學習:第2章 變數基本型別

第2章 變數和基本型別2.1 基本內建型別2.2 字面值常量2.3 變數2.4 const限定符2.5 引用2.6 typedef 名字2.7 列舉2.8 類型別2.9 編寫自己的標頭檔案 2.1 基本內建型別2.1.1 字元型別: char 和 wchar_t , char

c++ primer 筆記第二章變數基本型別(二)

2.4 const限定符 const定義的變數不能改變,因此const變數必須初始化。可以使用表示式初始化。 預設狀態下const物件僅在檔案內有效。 可以在宣告和定義都加extern。 練習2.26 (a) 不合法,未初始化 (b) 合法 (c) 合法 (d) 不合

C++ primer學習筆記——第二章 變數基本型別

一、基本內建型別 C++基本內建型別包括算術型別和空型別。 1.算術型別 算術型別分為兩類:整形(包括字元和布林型在內)和浮點型 bool(布林型)                         長度(位元組):1          取值範圍:false,true

Primer C++】第二章:變數基本型別

使用列表初始化初始化內建型別時,若存在丟失資訊的風險,編譯器將會報錯: long double ld = 3.1415926536; int b = { ld }; 預設初始化 變數的預設值與變數型別和變數所處的位置有關, 定義於任何函式之外的變數被初始化

C++ Primer中文版(第五版)--第二章 變數基本型別

   資料型別是程式的基礎,它告訴我們資料的意義以及我們能在資料上執行的操作      C++定義了幾種基本內建型別:字元、整型、浮點數等,同時程式設計師可以自定義資料型別,另外C++ 標準庫還定義了一些更加複雜的資料型別,如可變長字串和向量。 2.1 基本內建型別

C++Primer第五版 習題答案 第二章 變數基本型別(variables and basic types)

2.1 C++語言規定一個int至少和一個short一樣大,一個long至少和一個int一樣大,一個long long至少和一個long一樣大。每個的最小尺寸分別為:short,16位;int,16位;long,32位;long long,64位。 除去布林

重溫C++——變數基本型別

文章目錄 基本內建型別 複合型別 引用 指標 複合型別的宣告 指向指標的指標 引用指標的引用 const修飾符 const和引用 const和指標 指向常量的

C++變數基本型別(二)基本內建型別

變數      型別說明符    +    型別修飾符   +  變數名的形式 進行宣告一個變數。      int* intPointer; C++中的物件就是能儲存資料並有一定資料結構型別的記憶體空間。int型別也是物件。物件指的是可以被修改的資料,值指的是隻讀型別。