03 bool,const,引用,預設引數

2022-09-06 21:00:16 字數 2431 閱讀 9030

一.bool

bool val = true;//vs中佔1位元組,記憶體中數值為0x01

val = false;//記憶體中數值為0x00

val = 100;//記憶體中數值為0x01,warning c4305: 「=」: 從「int」到「bool」截斷

val = -1;//記憶體中數值為0x01,warning c4305: 「=」: 從「int」到「bool」截斷

結論:非0即true,0為false

二.const

1.巨集在預處理階段發生文字替換,所以除錯時看不到符號資訊。

const int val = 10;

*(int *)&val = 0;//通過位址強行改,觀察記憶體發現確實改變了,為0x00000000

int num = val;//但是num依舊是10

cout << num << " " << val;//列印2個10

結論:引用const的變數在編譯時,就將const變數直接用數值代替,而不是在執行時訪問const變數的記憶體獲取數值。

2.const和指標結合

2.1 const在*左側,代表指標指向的物件是const型別

int n = 10;

const int *p = &n;

int const *q = &n;//和上一句等價

//*p = 123;//指標指向的內容不能修改

p = nullptr;//指標本身可以修改

2.2 const在*右側,代表指標自身是const型別

int n = 10;

int *const p = &n;

*p = 123;//指標指向的內容可以修改

//p = nullptr;//指標本身不能修改

2.3 const在*左右兩側,代表指標指向的物件是const型別,指標自身也是const型別

int n = 10;

const int *const p = &n;

//*p = 123;//指標指向的內容不能修改

//p = nullptr;//指標本身不能修改

const int *p2 = p;//把常量p的值拷貝給p2。p和p2都滿足「指向的內容不能改」的限制

三.引用

1.指標的缺點:空指標,野指標

2.引用的用法

void foo1() 

void foo2()

3.引用的限制:

3.1 引用必須初始化

3.2 引用繫結乙個變數後,不能再繫結另乙個變數

3.3 不要返回區域性變數的指標或引用

//int &r;//引用必須初始化

float f = 1.0;

//int &rf = f;//error c2440: 「初始化」: 無法從「float」轉換為「int &」

4.引用作為函式引數:

用引用的方式交換兩個變數,單步到第8行時,記憶體視窗中第乙個方框內是變數a的位址,第二個方框內是變數b的位址。可見引用隱式傳遞了變數位址。

四.預設引數

1.基本用法

int foo(int n = 123, int m = 456) 

int res = foo(1, 2);//提供了引數,用提供的

res = foo();//不提供引數,用預設的

2.規則:一旦某個形參被賦予了預設值,它後面的所有形參都必須有預設值,例如有如下錯誤

int foo(int n = 123, int m)
3.分離式編譯時,預設引數的宣告放在標頭檔案中,實現放在cpp檔案中,且實現中不加預設引數。例如:

在foo.**件中放宣告:

int foo(int n = 123, int m = 456);
在foo.cpp檔案中放實現:

#include "foo.h"

int foo(int n, int m)

在main.cpp檔案中呼叫:

int res = foo(1, 2);//提供了引數,用提供的

res = foo();//不提供引數,用預設的

如果在foo.h和foo.cpp中都有預設引數,編譯器報錯:

error c2572: 「foo」: 重定義預設引數 : 引數 1

error c2572: 「foo」: 重定義預設引數 : 引數 2

如果在foo.h中沒有預設引數,而foo.cpp中有,編譯發現對foo()的呼叫時,找不到接收0個引數的foo的函式宣告,編譯器報錯:

error c2660: 「foo」: 函式不接受 0 個引數

C 基礎bool const 引用

c 中的布林型別 c 在c語言的基礎型別系統之上增加了bool c 中的bool可取的值只有false和true 理論上bool只占用乙個位元組,如果多個bool變數定義在一起,可能只會各佔乙個bit,這取決於編譯器的實現 true代表真值,編譯器內部用1表示 false代表非真值,編譯器內部用0表...

引數預設,引用

本篇文章將整理出關於引數預設和引用的一些知識。一 引數預設 引數預設包括全預設和半預設。顧名思義,全預設就是函式的所有引數都給出預設值,半 預設就是僅有函式的部分引數給出了預設值。看下邊的一段 includeusing namespace std int add int x,int y int ma...

03變數和引用

shell程式設計 例項 bin bash x 123 let x 1 echo x x echo 輸出空行 y echo y y declare i y echo y y let y 1 遇到含有非數值的字串,字串轉換為整數0 echo y y echo z abc22 echo z z m ec...