互聯(lián)網(wǎng)公司網(wǎng)站建設(shè)ppt模板下載站長素材免費(fèi)下載

??眾所周知C語言是面向過程的編程語言,關(guān)注的是過程;解決問題前,需要分析求解的步驟,然后編輯函數(shù)逐步解決問題。C++是基于面向?qū)ο?/strong>的,關(guān)注的是對象,將一件事拆分成不同的對象,不同對象間交互解決問題。
一、類的引出
??C語言結(jié)構(gòu)體只能定義變量;而在C++中,結(jié)構(gòu)體不僅可以定義變量,也可以定義函數(shù)。在前期的博文《C語言實(shí)現(xiàn)?!分?#xff0c;使用C語言實(shí)現(xiàn)棧,此時(shí)結(jié)構(gòu)體內(nèi)只能定義變量來構(gòu)造結(jié)構(gòu)體的成員;而C++中,在struct定義的結(jié)構(gòu)體內(nèi)可以構(gòu)造成員函數(shù)。具體如下所示:
struct stack
{
public:stack():_capacity(_capacity==0?4:2*_capacity),_a(new int[_capacity]),_top(0){}void push(const stack& s);void pop();bool empty();int top();int size();~stack(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
private:int* _a;int _top;int _capacity;
};
其中,在public中 stack( )、 ~stack( ) 為成員構(gòu)造函數(shù)、成員析構(gòu)函數(shù),push( )等為成員函數(shù);而在private中的都為成員變量。
二、類的定義
2.1 什么是類
??類是C++的核心特性,通常被稱為用戶定義的類型。類用于指定對象的形式,它包含了數(shù)據(jù)表示方法和處理數(shù)據(jù)的方法。
2.2 類的語法
class className
{//類體由成員函數(shù)和成員變量組成
};//分號不可遺漏
??class為定義類的關(guān)鍵字,classname為類的名字,{ }中為類的主體;此外,類的{ }結(jié)束后的分號不可省略。
類主體內(nèi)容稱為類的成員:類中變量稱為類的屬性或成員變量;類中函數(shù)稱為類的方法或成員函數(shù)。
類的兩種定義方式:
- 聲明和定義全部放在類體中;
- 聲明與定義分離;類聲明放在.h文件中,成員函數(shù)放在.cpp文件中;此外,在.cpp定義文件中,定義成員函數(shù)時(shí),需要在函數(shù)名前、返回值類型后添加類名::
//聲明與定義全在類體中
struct Date
{
public:Date(int year = 2000,int month = 10,int day = 1):_year(year),_month(month),_day(day){}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}void Print(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}~Date(){_year = 0;_month = 0;_day = 0;}
private:int _year;int _month;int _day;
};
第二種聲明與定義分離方式為:
//stack.h文件
struct Date
{
public:Date(int year = 2000, int month = 10, int day = 1);Date(const Date& d);void Print();~Date();
private:int _year;int _month;int _day;
};//stack.cpp文件
Date::Date(int year , int month , int day ):_year(year), _month(month), _day(day)
{}Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;
}
void Date::Print()
{cout << _year << "年" << _month << "月" << _day << "日" << endl;
}Date::~Date()
{_year = 0;_month = 0;_day = 0;
}
三、類的訪問限定符號及封裝
3.1 訪問限定符
C++實(shí)現(xiàn)封裝的方式:用類將對象的屬性與方法結(jié)合在一起,讓對象更加完善,通過訪問權(quán)限選擇性的將其接口提供給外部用戶使用。
訪問限定符說明:
-
public
修飾的成員在類外可以直接被訪問; -
protected
和private
修飾的成員在類外不能直接被訪問; -
訪問權(quán)限作用域從該訪問限定符出現(xiàn)的位置開始直到下一個(gè)訪問限定符出現(xiàn)為止;
-
如果后面沒有訪問限定符,作用域就到
}
即類結(jié)束; -
class的默認(rèn)訪問權(quán)限為
private
,struct為public
(因?yàn)閟truct要兼容C)。
注意:訪問限定符只在編譯時(shí)有用,當(dāng)數(shù)據(jù)映射到內(nèi)存后,沒有任何訪問限定符上的區(qū)別。
3.2 封裝
??面向?qū)ο蟮娜筇匦?#xff1a;封裝、繼承、多態(tài)。
??封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對外公開接口來和對象進(jìn)行交互。
??封裝本質(zhì)上是一種管理,讓用戶更方便使用類。在C++語言中實(shí)現(xiàn)封裝,可以通過類將數(shù)據(jù)以及操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,通過訪問權(quán)限來隱藏對象內(nèi)部實(shí)現(xiàn)細(xì)節(jié),控制哪些方法可以在類外部直接被使用。
四、類的作用域
??類定義了一個(gè)新的作用域,類的所有成員都在類的作用域中。在類體外定義成員時(shí),需要使用::
作用域操作符指明成員屬于哪個(gè)類域。
??在下列個(gè)人信息類中,add( )屬于person這個(gè)類域;個(gè)人的成員變量也屬于這個(gè)類域。
class person
{
public:void add();
private:int _year;int _sex;int _height;int _weight;int _tel;
};
int main()
{Date d1;d1.Print();return 0;
}
五、類的實(shí)例化
??用類類型創(chuàng)建對象的過程,稱為類的實(shí)例化。
-
類是對對象進(jìn)行描述的,是一個(gè)模型一樣的東西,限定了有哪些成員,定義出一個(gè)類并沒有分配實(shí)際的內(nèi)存空間來存儲它;
-
一個(gè)類可以實(shí)例化多個(gè)對象,實(shí)例化 出的對象,占用實(shí)際的物理空間,存儲類成員變量;
class person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int _age;
};void Person::PrintPersonInfo()
{cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
注意:person類是沒有空間的,只有person類實(shí)例化出來的對象才占用空間。
六、類對象模型
??在Date類中,既有成員函數(shù)又有成員變量;那么Date類占用多少存儲空間?
int main()
{Date d1;cout << "d1所占空間:" << sizeof(d1) << endl;return 0;
}
Date類對象d1初始化后,占用了12字節(jié);若Date類沒有初始化對象,不會占用存儲空間。
6.1 類對象的存儲
- 對象中包含類的各個(gè)成員
-
代碼只保存一份,在對象中保存存放代碼的地址
-
只保存成員變量,成員函數(shù)存放在公共的代碼段
6.2 結(jié)構(gòu)體內(nèi)存對齊規(guī)則
-
第一個(gè)成員與結(jié)構(gòu)體偏移量為0的地址處;
-
其他成員變量要對齊到某個(gè)數(shù)字(對齊數(shù))的整數(shù)倍的地址處;
-
結(jié)構(gòu)體總大小為:最大對齊數(shù)(所有變量類型最大者與默認(rèn)對齊參數(shù)取最小)的整數(shù)倍;
-
如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
注意:對齊數(shù)=編譯器默認(rèn)的一個(gè)對齊數(shù)與該成員大小的較小值;VS中默認(rèn)的對齊數(shù)為8。
七、this指針
7.1 類中this指針的使用
??在下列Date類中,有Init和Print兩個(gè)成員函數(shù),函數(shù)體中沒有關(guān)于不同對象的區(qū)分,若對象d1需要調(diào)用這兩個(gè)函數(shù)時(shí),C++引入了this指針。C++編譯器給每個(gè)非靜態(tài)的成員函數(shù)增加了一個(gè)隱藏的指針參數(shù),讓this指針指向當(dāng)前對象(函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對象),在函數(shù)體中所有“成員變量”的操作,都是通過該指針去訪問。這些操作不需要用戶操作,編譯器自動完成。
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout <<_year<< "-" <<_month << "-"<< _day <<endl;}private:int _year;int _month; int _day;
};int main()
{Date d1, d2;d1.Init(2022,1,11);d2.Init(2022, 1, 12);d1.Print();d2.Print();return 0;
}
7.2 this指針的特性
- this指針的類型:類類型 const*,即成員函數(shù)中,不能給this指針賦值;
- 只能在“成員函數(shù)”的內(nèi)部使用;
- this指針本質(zhì)上是“成員函數(shù)”的形參,當(dāng)對象調(diào)用函數(shù)時(shí),將對象地址作為實(shí)參傳遞給this形參。所以對象中不存儲this指針;
- this指針是“成員函數(shù)”第一個(gè)隱含的指針形參,一般情況由編譯器通過ecx寄存器自動傳遞,不需要用戶傳遞。