普通類型

數(shù)字類型

說(shuō)是數(shù)字類型,其實(shí)不止int, float那些,在c++中,boo, char, wchar_t, char16_t, char32_t等等都是。

  • char 八個(gè)位
  • int 十六個(gè)位
  • wchar_t 十六個(gè)位
  • long 三十二個(gè)位

使用sizeof在x64機(jī)器上打印出(單位是byte):

  • short 2
  • int 4
  • long 4
  • char 1

似乎在x64上int和long是一樣大的。
由于歷史原因,在微軟的機(jī)器上,由于歷史愿意這樣。

單精度與雙精度
單精度占用4個(gè)字節(jié),雙精度占用8個(gè)字節(jié)。
單精度有:一個(gè)符號(hào)位,八個(gè)exp位,23個(gè)數(shù)字位;
雙精度有:一個(gè)符號(hào)位,11個(gè)exp位,52個(gè)數(shù)字位。

unsigned和signed關(guān)鍵字

決定有沒(méi)有符號(hào)位。

  • 當(dāng)你知道你的變量不可能為負(fù)值的時(shí)候,可以使用unsigned。
  • 不要單純地使用char類型來(lái)代替short。因?yàn)樵诓煌臋C(jī)器上,有些char是unsigned的,有些是signed的。如果你非要這么用,就加上unsigned或者signed。
  • 能用double就用double。float經(jīng)常會(huì)不夠用。而且在某些機(jī)器上double還比f(wàn)loat要快。

自動(dòng)轉(zhuǎn)換

bool b = 43;
int i = b; // 1
i = 3.14; // 3
double pi = i; // 3.0
unsigned char c = -1; // 255
signed char c2 = 255; // 確實(shí)不是255,但轉(zhuǎn)成unsigned short之后打印出來(lái)還是255。給一個(gè)signed short賦值一個(gè)超過(guò)127的值會(huì)導(dǎo)致不可知后果,俗稱undefined。
cout << true; //出來(lái)是1,cout對(duì)于bool變量只會(huì)輸出1或者0
unsigned u = 10;
int i = -48;
cout << u + i; //32-bit的int會(huì)出來(lái)一個(gè)超大的數(shù)

兩個(gè)unsigned做運(yùn)算,如果出現(xiàn)了負(fù)數(shù),會(huì)被變成signed int。
由于unsigned永遠(yuǎn)不可能小于0,所以拿來(lái)while(u >= 0)做比較的話,會(huì)必然是true然后一直運(yùn)行。

unsigned和signed不要做混合運(yùn)算,會(huì)出事兒。

寫法

010 八進(jìn)制
0x10 十六進(jìn)制

string寫法

L`a` // wchar_t
u8"hi" //char (utf8)

list初始化

int a = {0};
long double b = 3.1111;
int c = ; //報(bào)錯(cuò),會(huì)丟失信息
int d = b; //通過(guò)

外部變量

extern int i; // 聲明了但是沒(méi)有定義
int j; // 聲明且定義

extern double pi = 3.14; //聲明且定義

一個(gè)變量只能被定義一次,但是可以被聲明多次。變量只能在某個(gè)一個(gè)文件里定義一次,但是可以在各個(gè)地方被聲明。
在方法里對(duì)extern進(jìn)行初始化會(huì)導(dǎo)致報(bào)錯(cuò)。錯(cuò)誤會(huì)比如是error: pi has both extern and initializer

keywords

像是andor,not這種關(guān)鍵字,主要是以前qwer鍵盤還不流行的時(shí)候用的,因?yàn)槟莻€(gè)時(shí)候的鍵盤可能沒(méi)有||或者&&之類的字符。
其實(shí)我覺得這樣挺lua,挺好的。

作用域

  • global scope
  • block scope
  • nested scope
    同樣的變量名,外部的變量會(huì)內(nèi)部的變量屏蔽。
#include<iostream>
int p = 10;
int main(){
    int p = 20; // 一般不建議這么做
    cout << p; // 這里的p其實(shí)是另一個(gè)東西了,外面的p被屏蔽 --> 20
    cout << ::p; // --> 10;
}

復(fù)合類型

引用

int ival = 1024;
int &refval = ival; // 相當(dāng)于起了個(gè)別名而已
int &refval2; // 一定要初始化,錯(cuò)
int &i1 = ival, i2 = ival; // i1是個(gè)引用,i2則不是
int &refVal4 = 10; // 右值一定要是一個(gè)object
double dval = 3.14;
int &refVal5 = dval; // 不行的,做不到的

一定要初始化,不存在rebind的。
理解為別名就最容易了,其它的不要多想。

指針

獲得指針

int i = 10;
int *p = &i;

獲得指針?biāo)笇?duì)象

*p = 100;
cout << *p;

傳一個(gè)指針過(guò)去,使得可以在另一個(gè)函數(shù)內(nèi)改變基礎(chǔ)變量(aka,非instance):

#include<iostream>
using namespace std;
void changeValue(int* p){
    *p = *p + 50;
}

int main(){
    int i = 10;
    changeValue(&i);
    cout << i << endl;
    cout << *&i << endl;
}

不同類型的指針不允許相互賦值

double d = 3.14;
double *p1 = &d;
int *p2 = p1; // error
int *p2 = &d; // error
int &ref = *p; // 對(duì)p所指的int進(jìn)行引用

空指針

int *p = nullptr; // 自動(dòng)賦值為0
int *p2 = 0; // 直接賦值為0

int i = 0;
int *pp2 = i; // 這樣又不行

// 必須 #include<cstdlib>
int *p3 = NULL;

// 是否為空指針
if(p){
    
}

注意
很容易眼花看錯(cuò)以為是創(chuàng)建了一個(gè)值為0的int并把它的值賦給了p。對(duì)于一個(gè)指針來(lái)說(shuō),0就代表著空指針!所以沒(méi)有所謂的真正的空,0即是空。

使用gcc編譯的時(shí)候,會(huì)出現(xiàn)一個(gè)nullptr was not declared in this scope的問(wèn)題,查出來(lái)說(shuō)編譯的時(shí)候需要加上-std=c++11的參數(shù),其它的c++11特性應(yīng)該也是需要這個(gè)的。

NULL需要一個(gè)cstdlib庫(kù)。在編譯之前,編譯器會(huì)先執(zhí)行preprocessor,初始化了NULL的值。NULL不屬于任何命名空間,所以也不需要使用std:NULL的形式來(lái)訪問(wèn)。


最好每個(gè)指針都要初始化,起碼要給個(gè)空指針。不然的話你都不知道它會(huì)指到哪里。
不像腳本語(yǔ)言沒(méi)初始化的時(shí)候就默認(rèn)為nil,c++這邊的空指針,是要手寫的。。。

引用與指針的區(qū)別

  • 引用只可以初始化一次,而后它的值就不允許更改??梢砸暈槭且粋€(gè)別名。

void*

可以指向任何object,可以等同于任何其他類型的指針。由于沒(méi)有類型,所以不能實(shí)例化(?)??梢院腿魏晤愋偷闹羔樧鞅容^。
一般單純地用來(lái)處理內(nèi)存。

一種惡心的寫法

int i = 1024, *p = &i, &ref = i;

指向引用的指針

有毒。
訣竅是從右往左讀。

int i = 10;
int *p;
int *&r = p;
r = &i;
*r = 100; // now the value of i is 100

Const

  • 不可被改變的值。
  • 一定要初始化,不然編譯不過(guò)。
  • 所謂的const,在編譯期間就會(huì)被替換為對(duì)應(yīng)的值。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容