大學必備C語言基礎知識(二)

2020-08-12 21:14:23

五、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)程式模組化設計風格

  1. 不要把變數定義放入.h檔案,這樣容易導致重複定義錯誤。
    永遠不要在.h檔案中定義變數。定義變數和宣告變數的區別在於定義會產生記憶體分配的操作,是彙編階段的概念;而宣告則只是告訴包含該宣告的模組在連線階段從其它模組尋找外部函數和變數
  2. 儘量使用static關鍵字把變數定義限制於該原始檔作用域,除非變數被設計成全域性的。
  3. 可以在標頭檔案中宣告一個變數,在用的時候包含這個標頭檔案就宣告瞭這個變數。
    總結:一般情況下標頭檔案中只放變數的宣告,因爲標頭檔案要被其他檔案包含(即#include),如果把定義放到標頭檔案的話,就不能避免多次定義變數,C++不允許多次定義變數,一個程式中對指定變數的定義只有一次,宣告可以無數次。