網(wǎng)站首頁 編程語言 正文
封裝的意義
封裝是C++三大面向?qū)ο笾?/p>
意義:
1、設(shè)計(jì)類的時(shí)候,屬性和行為寫在一起,表現(xiàn)事物
2、類在設(shè)計(jì)時(shí),可以把屬性和行為放在不同的權(quán)限下,加以控制
語法:class 類名 {訪問權(quán)限:屬性 / 行為};
示例1:設(shè)計(jì)一個(gè)直角三角形,并求解他的面積
#include<iostream>
using namespace std;
//class代表設(shè)計(jì)一個(gè)類,后面跟著的是類名
class taiAngle
{
public: //訪問權(quán)限 公共的權(quán)限
//屬性
int m_a;//直角邊a
int m_b;//直角邊b
//行為
//獲取三角形面積
double calculate()
{
return (m_a*m_b)/2;
}
};
int main() {
//通過三角形類,創(chuàng)建三角形的對象
// c1就是一個(gè)具體的三角形
taiAngle c1;
c1.m_a = 10; //給三角形兩邊進(jìn)行賦值操作
c1.m_b = 10;
cout << "三角形的面積為: " << c1.calculate() << endl;//調(diào)用方法
system("pause");
return 0;
}
示例2:設(shè)計(jì)一個(gè)學(xué)生類,屬性有姓名和學(xué)號(hào),可以給姓名和學(xué)號(hào)賦值,顯示學(xué)生的姓名和學(xué)號(hào)
//學(xué)生類
class Student {
public:
void setName(string name) {
m_name = name;
}
void setID(int id) {
m_id = id;
}
void showStudent() {
cout << "name:" << m_name << " ID:" << m_id << endl;
}
private:
string m_name;
int m_id;
};
int main() {
Student stu;
stu.setName("馬可波羅");
stu.setID(250);
stu.showStudent();
system("pause");
return 0;
}
在第二個(gè)案例中,姓名和學(xué)號(hào)是不會(huì)被直接訪問的,主函數(shù)中我們創(chuàng)建了stu學(xué)生類對象,但是我們輸入“stu."時(shí)不會(huì)出現(xiàn)m_name和m_id的提示,這就牽扯到了訪問權(quán)限的知識(shí)點(diǎn),處于私有權(quán)限的屬性只能靠成員方法加以控制,繼續(xù)往下看
訪問權(quán)限
public 公共權(quán)限:
成員:類內(nèi)可以訪問,類外可以訪問
任何一種繼承,子類可以訪問父類的公共成員
保護(hù)權(quán)限protected
成員:類內(nèi)可以訪問,類外不可以訪問
任何一種繼承,子類可以訪問父類的保護(hù)成員
私有權(quán)限private
成員:類內(nèi)可以訪問,類外不可以訪問。
任何一種繼承,子類不可以訪問父類的私有成員
示例:
class Person
{
//姓名 公共權(quán)限
public:
string m_Phone;
//手機(jī) 保護(hù)權(quán)限
protected:
string m_Phone;
//銀行卡密碼 私有權(quán)限
private:
int m_Password;
public:
void display();
};
void Person::display()
{
m_Name = "張三";
m_Phone = "華為";
m_Password = 123456;
}
int main() {
Person p;
p.m_Name = "李四";
//p.m_Phone = "iPhone 13"; //保護(hù)權(quán)限類外訪問不到
//p.m_Password = 123; //私有權(quán)限類外訪問不到
system("pause");
return 0;
}
這個(gè)案例中定義了三種權(quán)限的屬性,只有punlic:權(quán)限下的屬性和成員函數(shù)可以在類外被調(diào)用;這里的display方法我在public:權(quán)限下只是聲明的一下,然后在類外完成方法的實(shí)現(xiàn),但是需要在原來聲明的基礎(chǔ)上加"Person::"在返回值類型和函數(shù)名之間,以表示是Person這個(gè)類作用域下的display方法;main函數(shù)只可以調(diào)用display方法和修改m_Name屬性,因?yàn)橹挥羞@兩個(gè)在punlic:權(quán)限下了。
class和struct的區(qū)別
在C++中 struct和class唯一的區(qū)別就在于默認(rèn)的訪問權(quán)限不同
class 默認(rèn)權(quán)限是私有
struct 默認(rèn)權(quán)限是公共
示例:
class C1
{
int m_A; //默認(rèn)是私有權(quán)限
};
struct C2
{
int m_A; //默認(rèn)是公共權(quán)限
};
int main() {
C1 c1;
c1.m_A = 10; //錯(cuò)誤,訪問權(quán)限是私有
C2 c2;
c2.m_A = 10; //正確,訪問權(quán)限是公共
system("pause");
return 0;
}
class和struct中都定義了m_A屬性,但是main函數(shù)中是無法修改類c1對象的m_A屬性的
成員屬性私有
優(yōu)點(diǎn)1:將所有成員屬性設(shè)置為私有,可以自己控制讀寫權(quán)限
優(yōu)點(diǎn)2:對于寫權(quán)限,我們可以檢測數(shù)據(jù)的有效性
示例:
class Person {
public:
//姓名設(shè)置可讀可寫
void setName(string name) {
m_Name = name;
}
string getName()
{
return m_Name;
}
//獲取年齡
int getAge() {
return m_Age;
}
//設(shè)置年齡
void setAge(int age) {
if (age < 0 || age > 150) {
cout << "你個(gè)大烏龜!" << endl;
return;
}
m_Age = age;
}
//情侶設(shè)置為只寫
void setLover(string lover) {
m_Lover = lover;
}
private:
string m_Name; //可讀可寫 姓名
int m_Age; //只讀 年齡
string m_Lover; //只寫 愛人
};
int main()
{
Person p;
//姓名設(shè)置
p.setName("張三");
cout << "姓名: " << p.getName() << endl;
//年齡設(shè)置
p.setAge(50);
cout << "年齡: " << p.getAge() << endl;
//愛人設(shè)置
p.setLover("阿尼亞");
//cout << "愛人: " << p.m_Lover << endl; //只寫屬性,不可以讀取
system("pause");
return 0;
}
當(dāng)屬性都設(shè)計(jì)成私有時(shí),我們可以自己控制屬性的讀寫權(quán)限,讓程序更具有強(qiáng)壯性,通過寫方法來讀寫屬性,是不是很具有掌控性呢,接下來給出一個(gè)案例,加深理解。
案例練習(xí)
利用全局函數(shù)和成員方法兩種方式判斷兩個(gè)立方體是否相等,要求利用類的知識(shí),將屬性設(shè)置為私有。
參考代碼:
#include<iostream>
using namespace std;
//案例1 判斷兩個(gè)立方體是否相等
class Cube
{
public:
void setL(int l)
{
m_L = l;
}
int getL()
{
return m_L;
}
void setW(int w)
{
m_W = w;
}
int getW()
{
return m_W;
}
void setH(int h)
{
m_H = h;
}
int getH()
{
return m_H;
}
int Area(int a, int b, int c)
{
return 2 * (a * b + a * c + b * c);
}
int 體積(int a, int b, int c)
{
return a * b * c;
}
bool isSameByClass(Cube& x)
{
if (x.getH() == m_H && x.getL() == m_L && x.getW() == m_W)
{
return true;
}
else {
return false;
}
}
private:
int m_L;
int m_W;
int m_H;
};
//利用全局函數(shù)判斷,兩個(gè)立方體是否相等
bool isSame(Cube& c1, Cube& c2)
{
if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
{
return true;
}
else
{
return false;
}
}
int main()
{
Cube c1;
c1.setH(10);
c1.setL(10);
c1.setW(10);
Cube c2;
c2.setH(10);
c2.setL(10);
c2.setW(10);
cout << "面積為:" << c1.Area(c1.getH(), c1.getH(), c1.getL()) << endl;
cout << "體積為:" << c1.體積(c1.getH(), c1.getH(), c1.getL()) << endl;
//利用成員函數(shù)判斷立方體
if (c1.isSameByClass(c2))
{
cout << "兩個(gè)立方體相等" << endl;
}
else {
cout << "兩個(gè)立方體不相等" << endl;
}
//利用全局函數(shù)判斷
bool ret = isSame(c1, c2);
if (ret)
{
cout << "兩個(gè)立方體相等" << endl;
}
else {
cout << "兩個(gè)立方體不相等" << endl;
}
}
這是案例的源代碼,是個(gè)非常基礎(chǔ),能練習(xí)本篇博文內(nèi)容的案例,希望大家可以理解其中的代碼含義
原文鏈接:https://blog.csdn.net/m0_58618795/article/details/124774738
相關(guān)推薦
- 2022-05-17 Mybatis中報(bào)錯(cuò):attempted to return null from a method
- 2022-07-04 .NET性能優(yōu)化之為結(jié)構(gòu)體數(shù)組使用StructLinq的問題解析_實(shí)用技巧
- 2022-06-12 C#異步編程的三種模式_C#教程
- 2024-02-26 Cannot execute binary file 之原因
- 2022-09-15 C/C++如何實(shí)現(xiàn)循環(huán)左移,循環(huán)右移_C 語言
- 2022-01-18 django中ajax發(fā)送post請求報(bào)403錯(cuò)誤csrf禁止,解決只需三步
- 2022-08-05 安卓請求權(quán)限
- 2023-03-01 Golang中Append()使用實(shí)例詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支