C++類基礎(chǔ)
#include <iostream>
using namespace std;
class Stack //類,面向?qū)ο?,類名為Stack
{
????public: //以下內(nèi)容均為public,可供類外調(diào)用
???? Stack(); //類的構(gòu)造器constructor,在每次聲明類的對(duì)象時(shí)執(zhí)行初始化操作
???? Stack(const int); //構(gòu)造器的格式為 類名(參數(shù)可選) ,構(gòu)造器沒(méi)有返回值不寫void,多個(gè)構(gòu)造器構(gòu)成重載,注意避免重載和默認(rèn)參數(shù)二義性
???? ~Stack(); //析構(gòu)器destructor,在對(duì)象釋放時(shí)執(zhí)行,格式為 ~類名() ,無(wú)參無(wú)返回不寫void
???? //構(gòu)造器和析構(gòu)器在沒(méi)有手動(dòng)定義的情況下會(huì)默認(rèn)生成無(wú)參空函數(shù)
???? bool push(char); //在類中可以寫完整的函數(shù)定義,如果分成頭文件和.cpp兩部分應(yīng)在頭文件中只寫函數(shù)聲明
???? bool isFull() //所有在類聲明中定義的方法都將自動(dòng)內(nèi)聯(lián)
???? {
???? ????return top >= size; //調(diào)用的top、size均為類的成員/字段,在類中可直接調(diào)用
???? }
???? bool isempty()
???? {
???? ????return top <= 0;
???? }
???? char pop(); //類的普通函數(shù)/成員函數(shù)需聲明返回值類型
????private: //以下內(nèi)容均為private私有,在類外無(wú)法直接調(diào)用
???? char* arr; //成員arr,指針用于指向數(shù)組
???? int size=1024; //默認(rèn)數(shù)組的大小,c++11類內(nèi)初始化(之前版本不允許)
???? int top=0; //棧頂,默認(rèn)沒(méi)有項(xiàng)
}; //頭文件截止
//.cpp文件
Stack::Stack() //Stack類的名稱空間,不會(huì)和文件中全局函數(shù)Stack()沖突(如果有的話)
{
????arr = new char[size]; //構(gòu)造器中創(chuàng)建數(shù)組內(nèi)存塊
}
Stack::Stack(const int s) //接收一個(gè)參數(shù),用于指定棧的大小
{
???? size = s>0?s:size; //防御性代碼
???? arr = new char[size]; //類的函數(shù)中可以直接使用類的成員,即使在類聲明外
???? //函數(shù)中沒(méi)有打算改變s的值,所以聲明為const,盡量使用const提高函數(shù)的兼容性/避免用變量接收調(diào)用時(shí)傳入的常量
}
//錯(cuò)誤: Stack::size = 20; 在類外只能訪問(wèn)類的public內(nèi)容,在public的函數(shù)中可以訪問(wèn)private成員(就像上面的構(gòu)造函數(shù)中訪問(wèn)size)
Stack::~Stack()
{
????delete[]arr; //釋放構(gòu)造階段分配的空間
}
bool Stack::push(char ch) //向棧中壓入項(xiàng)
{
???? if (isFull())
???? ???? return false;
???? arr[top++] = ch;
?????return true;
}
char Stack::pop()
{
???? if (isempty())
???? ???? return NULL;
???? return arr[--top];
}
//如果在類外寫作inline char Stack::pop() {}將函數(shù)定義為內(nèi)聯(lián)函數(shù),類聲明中的函數(shù)原型不需要寫inline,所以將函數(shù)定義寫在類聲明中等價(jià)于在類外寫inline定義
int mainclass1()
{
???? Stack sta; //創(chuàng)建對(duì)象,該對(duì)象大小為成員大小的總和(有可能因?yàn)閷?duì)齊要求補(bǔ)一些空位),即char* arr 8/int size 4/int top 4總共16,不包含arr指向的動(dòng)態(tài)內(nèi)存,也不包含函數(shù)
???? cout << sizeof(sta) << endl;
???? sta.push('c');
???? cout<<sta.pop()<<endl;
???? Stack sta2(16); //調(diào)用有參構(gòu)造器
???? char ch = 'a';
???? while (sta2.push(ch++))
???? {
???????? continue;
???? }
???? while (!sta2.isempty())
???? {
???? ???? cout << sta2.pop();
???? }
???? //sta和sta2均為自動(dòng)變量,所在塊結(jié)束時(shí)會(huì)釋放,自動(dòng)調(diào)用~Stack()析構(gòu)器
???? Stack sta4(16), sta5(32), sta6; //前兩個(gè)使用有參構(gòu)造器,最后一個(gè)使用無(wú)參構(gòu)造器
???? Stack* ps = new Stack; //ps是指針,占一個(gè)指針的大小8字節(jié),指向new動(dòng)態(tài)分配的內(nèi)存空間,new Stack調(diào)用無(wú)參構(gòu)造器,將對(duì)象(16字節(jié))的地址傳給ps
???? delete ps; //動(dòng)態(tài)變量ps需要手動(dòng)釋放,調(diào)用delete釋放ps指向的空間時(shí)會(huì)先執(zhí)行對(duì)象的析構(gòu)器
???? Stack* ps2 = new Stack(16); //調(diào)用有參構(gòu)造器
???? delete ps2;
???? Stack sta3 = Stack(16); //等價(jià)于Stack sta3(16); 創(chuàng)建一個(gè)對(duì)象后標(biāo)識(shí)為sta3,實(shí)際經(jīng)過(guò)編譯后標(biāo)識(shí)符sta3不存在,直接使用sta3的地址
???? //如果類中沒(méi)有聲明成員,則類的大小為1(占位用),即便沒(méi)有成員、沒(méi)有手動(dòng)聲明構(gòu)造器,創(chuàng)建對(duì)象時(shí)依然會(huì)執(zhí)行默認(rèn)生成的構(gòu)造器,即創(chuàng)建對(duì)象一定會(huì)進(jìn)行初始化,即便初始化操作沒(méi)有改變?nèi)魏螙|西/沒(méi)有做任何事
???? //Stack c;只要?jiǎng)?chuàng)建對(duì)象,無(wú)論這語(yǔ)句寫在哪里,都會(huì)執(zhí)行初始化
???? return 0;
}
class Stack2
{
???? //不寫訪問(wèn)控制默認(rèn)private
???? int size_; //可以采用p_size或者size_表示數(shù)據(jù)成員
????public:
???? Stack2(int size) //形參正常書寫便于用戶理解
???? {
???? ????size_ = size; //size_對(duì)應(yīng)size便于維護(hù),且用戶無(wú)法看到私有的size_成員,只能看到構(gòu)造器中形參名size
???? }
};
class claSt1
{
???? int i;
???? char c;
???? double d;
};
void mainclaSt1()
{
????cout << sizeof(claSt1); //int占4字節(jié)char占1字節(jié),但double對(duì)齊要求為8所以char之后空出3字節(jié),實(shí)際大小16字節(jié)
}