C++ Primer第二章!
#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
bool bl = true;
char c = 'c'; //與機(jī)器字節(jié)一樣,大多數(shù)機(jī)器字節(jié)由8比特構(gòu)成。
wchar_t wc = 'c';
char16_t c16 = 'c'; //為Unicode字符集服務(wù)。可以儲(chǔ)存unicode的字符,而char也只能儲(chǔ)存ANSI字符!
char32_t c32 = 'c'; //為Unicode字符集服務(wù)。
short st = 1;
int it = 1;
long lt = 1;
long long llt = 1;
float ft = 0.1; //1字節(jié)表示,7個(gè)有效位。
double dt = 0.1; //2字節(jié)表示,16個(gè)有效位。
long double ldt = 0.1;
//應(yīng)該避免混用帶符號(hào)類型和無符號(hào)類型!在無符號(hào)類型進(jìn)行減法運(yùn)算時(shí),應(yīng)該保證不為負(fù)數(shù)!
unsigned char i1 = -1;
cout << int(i1) << endl; //unsigned char,賦值-1,所得結(jié)果為255。10000001原碼-11111110反碼-11111111補(bǔ)碼
unsigned u2 = 10;
int i2 = -42;
cout << i2 + i2 << endl;
cout << u2 + i2 << endl; //int值轉(zhuǎn)換為無符號(hào)值,導(dǎo)致異常結(jié)果
unsigned u3 = 42, u4 = 10;
cout << u3 - u4 << endl;
cout << u4 - u3 << endl; //必須確保無符號(hào)變量不可能為負(fù)值,否者會(huì)導(dǎo)致未知錯(cuò)誤,當(dāng)應(yīng)用于循環(huán)時(shí)尤其注意。
//初始化不是賦值,初始化是創(chuàng)建變量時(shí)賦予一個(gè)初始值,而賦值是把對(duì)象的當(dāng)前值擦除并以一個(gè)新值取代。
int i3 = 1;
int i4(1);
int i5 = { 0 }; //列表初始化,C11新規(guī)定。列表初始化,當(dāng)發(fā)生精度損失時(shí),會(huì)報(bào)告錯(cuò)誤!
int i6{ 0 };
double pi = 3.1415926;
int i7 = pi;
//int i8{ pi }; //當(dāng)初始值存在丟失信息時(shí),使用列表初始化會(huì)報(bào)錯(cuò)!
//在函數(shù)體內(nèi)部的內(nèi)置類型變量不被默認(rèn)初始化,其變量值是未定義的;在函數(shù)體之外的變量被初始化為0。所以,顯示初始化變量是非常必要的!
//每個(gè)類決定其初始化對(duì)象方式,例如string默認(rèn)初始化為空串。由類的默認(rèn)構(gòu)造函數(shù)決定!
//變量的命名規(guī)范:標(biāo)識(shí)符要體現(xiàn)實(shí)際含義;變量名一般用小寫字母;用戶自定義的類名用大寫字母開頭;如果標(biāo)識(shí)符由多個(gè)單詞組成,則單詞間應(yīng)有明顯區(qū)分。
int ival = 1024;
int &refVal = ival; //引用,即對(duì)象別名,程序?qū)⒁煤退某跏贾到壎?。引用必須被初始化? int *pVal = &ival; //指針,指針本身就是一種對(duì)象。但是也建議進(jìn)行空指針初始化!
cout << refVal << " " << *pVal << endl;
//空指針,注意不能把int變量直接賦給指針。
int *p1 = nullptr;//c++推薦方式!
int *p2 = 0;
int *p3 = NULL;
//void*指針
void *p4;
//int *p5 = static_cast<int*>(p4);//強(qiáng)制類型轉(zhuǎn)換。
//指向指針的指針
int ival2 = 1024;
int *p_ival2 = &ival2;
int **pp_ival2 = &p_ival2;
cout << ival2 << "-" << *p_ival2 << "-" << **pp_ival2 << endl;
//指針是對(duì)象,所以有引用
int ival3 = 1024;
int *pi_ival3 = &ival3;
int *&r_p_ival3 = pi_ival3;
//const限定符,指向常量的引用
const int ival3 = 1314; //cosnt對(duì)象創(chuàng)建時(shí)必須初始化!
const int ival4 = ival2; //利用一個(gè)對(duì)象去初始化const對(duì)象。
//extern const int ival5 = 1024; //如果想在多個(gè)文件之間共享const對(duì)象,必須在對(duì)象定義時(shí)加上extern。
const int &r_ival3 = ival3; //cosnt常量引用,引用ival3對(duì)象。常量引用綁定非常量對(duì)象、字面值;非常量引用不允許綁定常量對(duì)象。
//指向常量的指針
const int *p_ival3 = &ival3; //類似于指向常量的引用。
//常量指針,即指針對(duì)象地址不能修改。
int *const pp_ival3 = &ival3; //指針將一直指向ival3.
//指向常量的常量指針
const int *const ppp_ival3 = &ival3;
//頂層const和底層const
//頂層const表示(指針)本身是個(gè)常量;底層const表示指針?biāo)傅膶?duì)象是一個(gè)常量。
//const(底層) int *const(頂層) pp_ival3 = &ival3;
//常量表達(dá)式:值不會(huì)改變并且在編譯過程就能得到計(jì)算結(jié)果。
const int ival6 = ival3 + 520;
//將變量聲明為constexpr,便由編譯器來驗(yàn)證變量是否是一個(gè)常量表達(dá)式。
constexpr int ival7 = 520; //如果確定變量為常量,則就把它聲明為constexpr。
//算術(shù)類型、應(yīng)用和指針都是字面值類型,可以被定義為constexpr;而自定義類型string則不能!
constexpr int *q = nullptr; //如果constexpr定義指針,將所定義的對(duì)象置為頂層const。
//類型別名
typedef double wages; //wages是double的同義詞,p是double*的同義詞。
using uwages = wages; //C++新的規(guī)定,別名聲明
typedef wages *p;
//auto類型說明符,通過初始值來推算變量的類型
auto ai = 1;
//auto一般會(huì)忽略掉頂層const,如果希望推斷頂層const,則需要明確指出
const auto cai = 2;
//還可以將引用的類型設(shè)為auto,此時(shí)頂層常量屬性仍然保留
auto &rai = ai;
//decltype類型指示符,返回操作數(shù)的數(shù)據(jù)類型,包括頂層const和引用在內(nèi)。即推斷指針為引用,推斷函數(shù)為函數(shù)類型!
decltype(ai) dai = 2;
//特別用法
int di = 1, *dpi = &di, &dr = di;
decltype(dr + 0) b; //返回類型為int
decltype(*dpi) dc = dr; //返回類型為int&
decltype((di)) drr = dr;//雙括號(hào)的結(jié)果永遠(yuǎn)是引用
//自定義數(shù)據(jù)結(jié)構(gòu)
class Sales_data
{
string bookNo;
unsigned units_sold = 0; //類內(nèi)初始值,推薦使用值初始化。
double revenue = 0.0;
};
Sales_data data1, data2; //類通常被定義在頭文件中,而類所在頭文件的名字應(yīng)與類的名字一樣。
//頭文件保護(hù)符,避免頭文件被多次包含,從而導(dǎo)致重復(fù)定義
// #ifndef SALES_DATA_H
// #define SALES_DATA_H
// #include<string>
// /*聲明和定義*/
// #endif
cin.ignore();
return 0;
}
//C++定義了算術(shù)類型和空類型,其中算術(shù)類型包括字符、整數(shù)、布爾值、浮點(diǎn)數(shù)。
//帶符號(hào)包含正數(shù)、負(fù)數(shù)、零;不帶符號(hào)包含大于等于0的值。不帶符號(hào)聲明:unsigned int i=1。
//signed char表示-128~127,unsigned char表示0~255,不要聲明char。
//當(dāng)明確知曉數(shù)值不可能為負(fù)時(shí),選用無符號(hào)類型;如果你的數(shù)值超出int范圍,選用long long;在算術(shù)表達(dá)式中不要使用char和bool,只有存放字符和布爾值時(shí)才使用它;執(zhí)行浮點(diǎn)運(yùn)算選用double。
//內(nèi)置類型轉(zhuǎn)換:0為false,否則為true;false為0,true為1;浮點(diǎn)數(shù)到整數(shù),僅保留整數(shù)部分;整數(shù)轉(zhuǎn)浮點(diǎn)型,小數(shù)部分為0,如果整數(shù)所占空間超過浮點(diǎn)型容量,否則精度有可能損失;給帶符號(hào)類型超范圍值,結(jié)果是未定義的;
第二章介紹了C++基本的數(shù)據(jù)類型(算術(shù)型+引用+指針)及其用法,另外也講解了C++對(duì)于復(fù)合類型的支持(類),