帶你從頭學(xué)習(xí)C++的封裝
封裝
c++認(rèn)為萬(wàn)事萬(wàn)物皆為對(duì)象,對(duì)象上有其屬性和行為
封裝的意義:
- 將屬性和行為作為一個(gè)整體,表現(xiàn)生活中的事物
- 將屬性和行為加以權(quán)限控制
封裝意義一:
在設(shè)計(jì)類(lèi)的時(shí)候,屬性和行為寫(xiě)在一起,表現(xiàn)事物
語(yǔ)法:
class 類(lèi)名{ 訪問(wèn)權(quán)限:屬性 / 行為};
屬性和行為作為整體
#include<iostream>
using namespace std;
//圓周率
const double PI = 3.14;
//設(shè)計(jì)一個(gè)圓類(lèi),求圓的周長(zhǎng)
//圓求周長(zhǎng)的公式:2*PI*半徑
class Circle {
//訪問(wèn)權(quán)限
//公共權(quán)限
public:
//屬性
//半徑
int m_r;
//行為
//獲取圓的周長(zhǎng)
double calculateZC() {
return 2 * PI * m_r;
}
};
int main() {
//通過(guò)圓類(lèi),創(chuàng)建具體的圓(對(duì)象)
//實(shí)例化 (通過(guò)一個(gè)類(lèi) 創(chuàng)建一個(gè)對(duì)象的過(guò)程)
Circle c1;
//給圓對(duì)象的屬性進(jìn)行賦值
c1.m_r = 10;
//2 * PI * m_r = 62.8;
cout << "圓的周長(zhǎng)為:" << c1.calculateZC () << endl;
system("pause");
return 0;
}實(shí)例—設(shè)計(jì)學(xué)生類(lèi)
#include<iostream>
using namespace std;
//#include<string>
//設(shè)計(jì)一個(gè)學(xué)生類(lèi),屬性有姓名和學(xué)號(hào),可以給姓名和學(xué)號(hào)賦值,可以顯示學(xué)生的姓名和學(xué)號(hào)
//設(shè)計(jì)學(xué)生類(lèi)
class Student {
public://公共權(quán)限
//類(lèi)中的屬性和行為 我們統(tǒng)一稱(chēng)為 成員
//屬性 成員屬性 成員變量
//行為 成員函數(shù) 成員方法
//屬性
string m_Name;//姓名
int m_Id;//學(xué)號(hào)
//行為
//顯示姓名和學(xué)號(hào)
void showStudent() {
cout << "姓名:" << m_Name << " 學(xué)號(hào):"<<m_Id << endl;
}
//給姓名賦值
void setName(string name) {
m_Name = name;
}
void setId(int Id) {
m_Id = Id;
}
};
int main() {
//創(chuàng)建一個(gè)具體的學(xué)生 實(shí)例化對(duì)象
Student s1;
//給s1對(duì)象進(jìn)行屬性賦值操作
//s1.m_Name = "張三";
s1.setName("張三");
//s1.m_Id = 1;
s1.setId(1);
s1.showStudent();
Student s2;
s2.m_Name = "李四";
s2.m_Id = 2;
s2.showStudent();
system("pause");
return 0;
}訪問(wèn)權(quán)限
封裝意義二:
類(lèi)在設(shè)計(jì)時(shí),可以把屬性和行為放在不同的權(quán)限下,加以控制
權(quán)限訪問(wèn)有三類(lèi):
- public 公共權(quán)限
- protected 保護(hù)權(quán)限
- private 私有權(quán)限
#include<iostream>
using namespace std;
//訪問(wèn)權(quán)限
//三種
//公共權(quán)限 public 成員 類(lèi)內(nèi)可以訪問(wèn) 類(lèi)外也能訪問(wèn)
//保護(hù)權(quán)限 protected 成員 類(lèi)內(nèi)可以訪問(wèn) 類(lèi)外不可以訪問(wèn) 兒子可以訪問(wèn)到父親中的保護(hù)內(nèi)容
//私有權(quán)限 private 成員 類(lèi)內(nèi)可以訪問(wèn) 類(lèi)外不可以訪問(wèn) 兒子不可以訪問(wèn)到父親的私有內(nèi)容
class Person {
public:
//公共權(quán)限
string m_Name;//姓名
protected:
//保護(hù)權(quán)限
string m_Car;//汽車(chē)
private:
int m_Password;//銀行卡密碼
public:
void func() {
m_Name = "張三";
m_Car = "拖拉機(jī)";
m_Password = 123456;
}
};
int main() {
//實(shí)例化具體對(duì)象
Person p1;
p1.m_Name = "李四";
//p1.m_Car = "奔馳";//保護(hù)權(quán)限的內(nèi)容,在類(lèi)外訪問(wèn)不到
//p1.m_Password = 123;//私有權(quán)限的內(nèi)容,在類(lèi)外訪問(wèn)不到
system("pause");
return 0;
}class與struct區(qū)別
在c++中struct和class唯一的區(qū)別就在于默認(rèn)的訪問(wèn)權(quán)限不同
區(qū)別:
- struct默認(rèn)權(quán)限為公共
- class默認(rèn)權(quán)限為私有
#include<iostream>
using namespace std;
class C1 {
int m_A;//默認(rèn)權(quán)限 是私有
};
struct C2 {
int m_A;//默認(rèn)權(quán)限 是公共
};
int main() {
//struct和class區(qū)別
//struct 默認(rèn)權(quán)限是 公有 public
//class 默認(rèn)權(quán)限是 私有 private
C1 c1;
//c1.m_A = 100;//在class里默認(rèn)權(quán)限 私有,因此類(lèi)外不可以訪問(wèn)
C2 c2;
c2.m_A = 100;//在struct默認(rèn)的權(quán)限為公共,因此可以訪問(wèn)
system("pause");
return 0;
}成員屬性私有化
- 優(yōu)點(diǎn)1:將所有成員屬性設(shè)為私有,可以自己控制讀寫(xiě)權(quán)限
- 優(yōu)點(diǎn)2:對(duì)于寫(xiě)權(quán)限,我們可以檢測(cè)數(shù)據(jù)的有效性
#include<iostream>
using namespace std;
#include<string>
//成員屬性設(shè)置為私有
//1.可以自己控制讀寫(xiě)權(quán)限
//2.可以寫(xiě)可以檢驗(yàn)數(shù)據(jù)的有效性
//設(shè)計(jì)人類(lèi)
class Person {
public:
//設(shè)置姓名
void setName(string name) {
m_Name = name;
}
//獲取姓名
string getName() {
return m_Name;
}
//獲取年齡 只讀
int getAge() {
//m_Age = 0;//初始化零歲
return m_Age;
}
void setAge(int age) {
if (age < 0 || age>150) {
m_Age = 0;
cout << "你這個(gè)老妖精!" << endl;
return;
}
m_Age = age;
}
//設(shè)置情人 只寫(xiě)
void setLover(string lover) {
m_Lover = lover;
}
private:
//姓名 可讀可寫(xiě)
string m_Name;
//年齡 只讀
int m_Age;
//情人 只寫(xiě)
string m_Lover;
};
int main() {
Person p;
p.setName ( "張三");
cout << "姓名為:" <<p.getName() << endl;
//p.m_Age = 18;
//p.setAge(18);
p.setAge(18);
cout << "年齡為:" << p.getAge() << endl;
//設(shè)置情人為蒼井女士
p.setLover("蒼井");
//cout<<"情人為:"<<p.m_Lover << endl;只寫(xiě)權(quán)限,數(shù)據(jù)不可以訪問(wèn)到的
system("pause");
return 0;
}設(shè)計(jì)立方體類(lèi)
#include<iostream>
using namespace std;
//立方體類(lèi)設(shè)計(jì)
//1.創(chuàng)建立方體類(lèi)
//2.設(shè)計(jì)屬性
//3.設(shè)計(jì)行為 獲取立方體面積和體積
//4.分別利用全局函數(shù)和成員函數(shù) 判斷兩個(gè)立方體是否相等
class Cube {
public:
//行為
// 設(shè)置長(zhǎng)
void setL(int l) {
m_L = l;
}
// 獲取長(zhǎng)
int getL() {
return m_L;
}
// 設(shè)置寬
void setW(int w) {
m_W =w ;
}
// 獲取寬
int getW() {
return m_W;
}
// 設(shè)置高
void setH(int h) {
m_H = h;
}
// 獲取高
int getH() {
return m_H;
}
// 獲取立方體面積
int calculateS() {
return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_W * m_H;
}
// 獲取立方體體積
int calculateV() {
return m_L * m_W * m_H;
}
//利用成員函數(shù)判斷兩個(gè)立方體是否相等
bool isSameByClass(Cube &c) {
if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH()) {
return true;
}
return false;
}
private:
//屬性
int m_L;//長(zhǎng)
int m_W;//寬
int m_H;//高
};
//利用全局函數(shù)來(lái)判斷 兩個(gè)立方體是否相等
bool isSame(Cube &c1,Cube &c2) {
if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()) {
return true;
}
return false;
}
int main() {
//創(chuàng)建立方體對(duì)象
Cube c1;
c1.setL(10);
c1.setW(10);
c1.setH(10);
cout << "c1的面積為:" <<c1.calculateS() << endl;
cout << "c1的體積為:" << c1.calculateV() << endl;
//創(chuàng)建第二個(gè)立方體
Cube c2;
c2.setL(10);
c2.setW(10);
c2.setH(10);
//利用全局函數(shù)判斷
bool ret = isSame(c1,c2);
if (ret) {
cout << "c1和c2是相等的" << endl;
}
else {
cout << "c1和c2是不相等的" << endl;
}
//利用成員函數(shù)判斷
ret = c1.isSameByClass(c2);
if (ret) {
cout << "成員函數(shù)判斷的:c1和c2是相等的" << endl;
}
else {
cout << "成員函數(shù)判斷的:c1和c2是不相等的" << endl;
}
system("pause");
return 0;
}總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)電話簿項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電話簿項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
Sublime Text 3 實(shí)現(xiàn)C語(yǔ)言代碼的編譯和運(yùn)行(示例講解)
下面小編就為大家?guī)?lái)一篇Sublime Text 3 實(shí)現(xiàn)C語(yǔ)言代碼的編譯和運(yùn)行(示例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
C語(yǔ)言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn),包括雙向劃分快速排序方法的介紹,需要的朋友可以參考下2015-11-11
Qt無(wú)邊框窗口拖拽和陰影的實(shí)現(xiàn)
自定義窗口控件的無(wú)邊框,窗口事件由于沒(méi)有系統(tǒng)自帶邊框,無(wú)法實(shí)現(xiàn)拖拽拉伸等事件的處理,本文主要介紹了Qt無(wú)邊框窗口拖拽和陰影的實(shí)現(xiàn),感興趣的可以了解一下2024-01-01

