隨著程序越來越復雜,程序中用到的類型也越來越復雜,這種復雜性體現在兩個方面。一是一些類型難于“拼寫”,它們的名字既難記又容易寫錯,還無法明確體現其真實目的和含義。二是有時候根本搞不清到底需要什么類型,不得不回過頭從程序的上下文中尋求幫助**
類型別名(type alias)是一個名字,它是某種類型的同義詞。 主要分為typedef關鍵字和別名聲明兩部分。
typedef關鍵字typedef double wages; //wages和double是同義詞,所表達的意思一樣typedef wages base, *p; //base和double是同義詞,*p和double *是同義詞別名聲明(alias declaration): 用using關鍵字作為別名聲明的開始,后緊跟別名和等號。using SI= Sales_item; //SI和Sales_item 是同義詞auto類型說明符(c++11新標準):讓編譯器替我們去分析表達式所屬的類型,而且必須有初始值。
auto item=val1+val2;//由val1和val2相加的結果可以推斷出item的類型atuo i=0,*p=&i; //正確,i是整數,p是整形指針atuo sz=0,pi=3.14; //錯誤,sz和pi的類型不一致const int ci=i, &cr=ci;auto b=ci; //b是一個整數auto c=cr; //c是一個整數auto d=&i; //d是一個整形指針auto e=&ci; //e是一個指向整數常量的指針const atuo f=ci; //f是const intdecltype類型指針,作用是選擇并返回操作數的數據類型 decltype(f()) sum=x; //sum類型就是說函數f的返回類型
在處理頂層const和引用時,如果decltype使用的表達式是一個變量,則decltype返回該變量的類型。
const int ci=0,&cj=ci;decltype(ci) x=0; //x的類型為const intdecltype(cj) y=x; //y的類型是const int&,y綁定變量xdecltype(cj) z; //錯誤:z是一個引用,必須初始化//decltype的結果是可以引用的類型int i=42,*p=&i,&r=i;decltype(r+0) b; //正確:加法的結果是int,因此b是intdecltype(*p) c; //錯誤,c是int&,必須初始化自定義數據結構 數據結構是把一組相關的數據元素組織起來然后使用它們的策略和方法。C++允許用戶以類的形式自定義數據結構,諸如string、istream等也都是以類的形式定義的。 注意:類右側表示結束的花括號必須寫一個分號,這是因為類體后面可以緊跟變量名表示對該類型對象的定義。
struct Sales_data{/*...*/};Sales_data accum,trans,*salesptr;數據成員(data menber),類的數據成員定義了類的對象的具體內容,每個對象有自己的一份數據成員拷貝。修改一個對象的數據成員,不會影響其它對象。 定義數據成員的方法和定義普通變量一樣:首先說明一個基本類型,隨后緊跟一個或多個聲明符。
頭文件:為了確保各個文件鐘類的定義一致,類通常被定義在頭文件中,而且類所在頭文件的名字必須與類的名字一樣。例如:庫類型string在名為string的頭文件鐘定義。 注意:頭文件一旦被改變,相關的源文件必須重新編譯以獲得更新過的聲明。 預處理器(PReprocessor):確保頭文件多次包含仍能夠安全的工作,預處理器是在編譯之前執行的一段程序,可以部分地改變我們所寫的程序,比如常用的#include,當預處理器看到#include標記的時候就會用指定頭文件的內容代替#include。 頭文件保護符(header guard),頭文件保護符依賴預處理變量,分為已定義和未定義兩種狀態。#define指令把一個名字設定為預處理變量,另外兩個指令則分別檢查某個指定的預處理變量是否已經定義;#ifdef當且僅當已定義為真時,#ifdef當且僅當未定義為真時。一旦檢查結果為真,則執行后續操作直到遇到#endif結束。
#ifndef SALES_DATA_H#define SALES_DATA_H#include<string>struct Sales_data{ std::string bookNo; unsigned units_sold=0; double revenue-0.0;};#endif第一次包含Sales_data.h時,#ifndef檢查結果為真,預處理器將順序執行后面內容直到遇到#endif結束。這時候預處理變量SALES_DATA_H的值變為已經定義,而且Sales_data.h也會被拷貝到我們程序中,如果再包含Sales_data.h則#ifndef的檢查結果為假,后面不再執行#ifndef到#endif內容。 預處理器變量無視C++語言中關于作用域的規則。為了避免與程序中其它實體發生沖突,一般把預處理器變量名字全部大寫。 提醒:頭文件沒有被包含在任何其他頭文件中,也應該設置保護符。
新聞熱點
疑難解答
圖片精選