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