談到封裝,我們這里指的是對(duì)類的成員的私有化,其實(shí)究其根本做的比較多的是對(duì)成員變量隱藏肛根。
private 關(guān)鍵字的作用在于更好地隱藏類的內(nèi)部實(shí)現(xiàn)兰吟,我們可以成為“私有”。它與我們之前看到的public屬于同一類的關(guān)鍵字。
C++設(shè)計(jì)規(guī)范要求,實(shí)際項(xiàng)目開(kāi)發(fā)中的成員變量以及只在類內(nèi)部使用的成員函數(shù)(只被成員函數(shù)調(diào)用的成員函數(shù))都建議聲明為 private,而只將允許通過(guò)對(duì)象調(diào)用的成員函數(shù)聲明為 public斋射。
對(duì)于訪問(wèn)權(quán)限限定符:public、private但荤、protected我們將在后面繼承中給大家細(xì)說(shuō)罗岖。
封裝,即對(duì)類中的成員變量進(jìn)行private私有化的修飾腹躁,隱藏其可見(jiàn)性桑包,如果類外想進(jìn)行訪問(wèn),可以通過(guò)setXXX函數(shù)和getXXX函數(shù)進(jìn)行成員變量的賦值和取值纺非。
基本的要求是針對(duì)每一個(gè)private封裝的成員變量要有一對(duì)set函數(shù)和get函數(shù)與其對(duì)應(yīng)哑了,函數(shù)名以get或set開(kāi)頭,后接成員變量名烧颖,如 setAge(int age)弱左,getAge()。
例如:
#include<iostream>
using namespace std;
class Member
{
private:
string name;
double salary;
public:
void setName(string name);
string getName();
void setSalary(double salary);
double getSalary();
};
void Member::setName(string name)
{
this->name = name;
}
string Member::getName()
{
return this->name;
}
void Member::setSalary(double salary)
{
this->salary = salary;
}
double Member::getSalary()
{
return this->salary;
}
int main()
{
Member m;
m.setName("張三");
cout << m.getName() << endl;
return 0;
}
this是一個(gè)關(guān)鍵字炕淮,也是一個(gè) const 指針拆火,它指向當(dāng)前對(duì)象,通過(guò)它可以訪問(wèn)當(dāng)前對(duì)象的所有成員涂圆。
this->name 指定的是當(dāng)前對(duì)象的成員變量name们镜。
注意:
1、this是const指針润歉,它的值是不能被修改的模狭,修改該指針的操作都是不允許的,如賦值踩衩、遞增嚼鹉、遞減等贩汉。
2、this 只能在成員函數(shù)內(nèi)部使用锚赤,用在其他地方?jīng)]有意義匹舞,也是非法的。
3宴树、只有當(dāng)對(duì)象被創(chuàng)建后 this 才有意義策菜,因此不能在 static 成員函數(shù)中使用晶疼,后續(xù)會(huì)講到 static酒贬。
從編譯器的原理來(lái)說(shuō),this 實(shí)際上是成員函數(shù)的一個(gè)形參翠霍,在調(diào)用成員函數(shù)時(shí)將對(duì)象的地址作為實(shí)參傳遞給 this锭吨。
這個(gè)形參是隱式的,它并不出現(xiàn)在代碼中寒匙,而是在編譯階段由編譯器將它添加到參數(shù)列表中零如。
this 在我們程序中主要是區(qū)別成員變量和局部變量。
說(shuō)到這兩個(gè)形式的變量锄弱,我們就來(lái)總結(jié)下
(1)位置不同
成員變量:類中函數(shù)外
局部變量:函數(shù)定義中或者函數(shù)聲明上
(2)在內(nèi)存中的位置不同
成員變量:在堆中
局部變量:在棧中
(3)生命周期不同
成員變量:隨著對(duì)象的創(chuàng)建而產(chǎn)生考蕾,隨著對(duì)象的銷毀而消失
局部變量:隨著函數(shù)執(zhí)行到該變量產(chǎn)生,隨著函數(shù)的執(zhí)行完畢而消失