五、C++定義與宣告
基本知識
(1)物件是指一塊能儲存數據並具有某種型別的記憶體空間,簡言之,物件是具有某種數據型別的記憶體空間,而變數則爲命了名的物件;
(2)數據型別:算術型別,類(class:類,類體),結構(struct:結構,結構體),指針,陣列。
(3)標準庫型別:字串:string,向量:vector。
(4)C++語言自己定義的基本內建型別包括兩大類:算術型別和空型別(void),算術型別包括:
布爾型別(bool:布爾型別)、
字元型(char:字元1byte,wchar_t:寬字元,char16_t:16位元Unicode字 符,char32_t:32位元Unicode字元)、
整型(int:整形4bytes,short:短整型2bytes,long:長整型,long long:長整型)、
浮點型(float:單精度浮點數4bytes,double:雙精度浮點數8bytes,long double:擴充套件精度浮點數8bytes).
空型別不對應具體的值,它的一種應用是,當函數不返回任何值時使用空型別作爲返回型別,表示函數無返回值。
(5)sizeof運算子:返回一條表達式或一個型別名字所佔的位元組數:
sizeof(type),sizeof expr。
int a;
char s[]="He likes swim very much."
struct
{
int num;
char name[];
int age;
}person;
sizeof(a); // 計算變數a所佔的位元組數,等價於sizeof(int)
sizeof(s); // 計算字串所佔的位元組數(包括串尾的串結束符'\0'在內)
sizeof(person); // 計算整個結構所佔的位元組總數
定義與宣告:
(1)參照(Reference)
int ival=1024;//定義int型變數,並賦初值1024
int &refval=ival;//定義一個指向整型變數ival的參照refval
定義參照需在參照名前以’&'爲開頭
(2)指針(Pointer)
int ival=42;
int *ip;//定義一個指向int型物件(或說int型變數)的指針
ip=&ival;//取變數ival的地址賦給指針ip,讓指針ip指向變數ival,其中,&爲取地址符
int ival1=*ip;//對指針ip解除參照,得到指針所指向的物件,即變數ival,並把此物件的值賦給新定義的int型變數ival1,其中'*'爲解除參照符
(3)const限定符
const int size=512;//定義一個整型常數,也可說定義一個整型的const變數,並賦初值512
const int &r1=size;//定義一個指向整形常數的參照(常數參照)r1,這是一個對常數的參照
const double pi=3.14;//定義一個雙精度浮點型常數,賦初值3.14,其值不能改變
const double *ptr=π//定義一個指向常數的double型指針,並把變數pi的地址賦給指針(一個指向常數的指針)
int errNumb=0;//定義一個整型變數
int *const curErr=&errNum;//定義一個常數指針,指針將一直指向errNum
const double pi=3.14159;//定義一個double型的常數
const double *const pip=π//定義一個指向常數物件的常數指針
因爲const物件一旦建立後其值就不能再改變,所以const物件必須初始化,或者說const物件必須初始化,而一旦初始化完成,則它的值就不能再改變。
指向常數的指針表示指針所指向的物件的值不能改變,但指針本身所存的物件地址卻是可以改變的,而要想存放常數物件的地址,只能使用指向常數的指針;指針是物件而參照不是,因此如其他物件型別 一樣,可以把指針本身定義爲常數,即,對指針初始化後,指針所儲存的物件地址就不能再改變。這種指針稱爲常數指針(const pointer)。
(4)型別別名
typedef double wages;//定義數據型別double的別名爲wages,wages是double的同義詞
typedef wages base,*p;//base是double的同義詞,p是double*的同義詞
wages hourly,weekly;//等價於double hourly,weekly;
using SI=int;//SI是int型別的同義詞
SI week;//等價於int week;
型別別名是一個名字,它是某種型別的同義詞。使用型別別名的主要作用在於,讓複雜的型別名字變得簡單明瞭、易於理解和使用,還有助於程式設計師清楚地知道使用該型別的真實目的。型別別名和型別的名字等價,只要是型別的名字能出現的地方,就能使用型別名。
C++ 11標準規定了一種新的定義型別別名的方法:使用關鍵字using作爲別名宣告的開始,其後緊跟別名和等號,其作用是把等號左側的名字規定成等號右側型別的別名。
(5)標準庫型別string
#include <string>
using std::string;//或using namespace std;
string s1;//定義一個string型別的變數,預設初始化,s1是一個空字串
string s2=s1;//s2是s1的副本
string s2(s1);//等價於s2=s1,s2是s1的副本
string s3="hiya";//s3是「hiya」這個字串字面值的副本:拷貝初始化
string s3("hiya");//等價於s3="hiya",s3是字面值「hiya」副本:直接初始化
string s4(5,'c');//s4的內容爲含5個字元的字串「ccccc」:直接初始化
標準庫型別string表示可變長的字元序列,使用string型別必須首先包含string標頭檔案和宣告使用標準名稱空間std中string的這個名字。
宣告和定義的概念
(1)函數的宣告和定義區別比較簡單,帶有{ }的就是定義,否則就是宣告。
(2)除非有extern關鍵字,否則都是變數的定義。
例如:
extern int i; //宣告
int i; //定義
(3)程式模組化設計風格