C++編程:進階階段—4.1封裝

?C++面向對象的三大特性:封裝、繼承、多態

具有相同性質的對象,抽象為類

4.1 封裝

封裝的意義:將屬性和行為作為一個整體,表現生活中的事物,并將屬性和行為加以權限控制。

4.1.1 類的定義及實例化對象

語法:class 類名{訪問權限:屬性/行為};

類中的屬性和行為統稱為成員,屬性也可以稱為成員屬性或成員變量,行為也可以稱為成員函數或成員方法。

代碼如下:

#include <iostream>
using namespace std;//設計一個圓類,求圓的周長
const double PI=3.14;//class代表設計一個類,類后面緊跟的是類名稱
class Circle
{//訪問權限
public://公共權限//屬性//半徑int r;//行為:獲取圓的周長double calculateZC(){return 2*PI*r;}};int main()
{//實例化:通過圓類,創建具體的圓(對象)Circle c1;//給圓對象的屬性進行賦值c1.r=10;cout<<"圓的周長為:"<<c1.calculateZC()<<endl;return 0;
}

輸出如下:

4.1.2 訪問權限

訪問權限分為三種:

  • 公共權限:類內外都可以訪問成員
  • 保護權限:類內可以訪問成員,類外不能訪問
  • 私有權限:類內可以訪問成員,類外不能訪問

代碼如下:

#include <iostream>
using namespace std;class Person
{//公共權限
public:string name;//保護權限
protected:string car;//私有權限
private:int passwd;
public:void func(){name="ddd";car="bench";passwd=4444;}
};
int main()
{//實例化一個對象Person p1;//給圓對象的屬性進行賦值p1.name="dddd";//p1.car="paosij";//p1.passwd=1234;return 0;
}

錯誤示例:修改保護權限和私鑰權限的屬性。

成員屬性設置為私有,可以自己控制讀寫權限,對于寫權限,可以檢測數據的有效性。

代碼如下:

#include <iostream>
using namespace std;class Person
{
public://設置姓名void setName(string name){m_name=name;}//獲取姓名string getName(){return m_name;}//獲取年齡int getAge(){return m_age;}//設置偶像void setIdol(string idol){m_idol=idol;}private:string m_name;//姓名 可讀可寫int m_age=18;//年齡 只讀string m_idol;//偶像 只寫};
int main()
{//實例化一個對象Person p;//設置姓名p.setName("ddd");//獲取姓名cout<<"姓名:"<<p.getName()<<endl;//設置年齡,不存在該函數//p.setAge("ddd");//報錯 不存在該成員setAge//p.m_age=23;//報錯 無法訪問//獲取年齡cout<<"年齡:"<<p.getAge()<<endl;//設置偶像p.setIdol("huge");//獲取偶像,沒有獲取函數//cout<<"偶像:"<<p.getIdol()<<endl;//報錯 不存在該成員getIdol//cout<<"偶像:"<<p.m_idol()<<endl;//報錯 無法訪問return 0;
}

錯誤示例:

4.1.3 struct 與 class

  • struct默認權限為公共
  • class默認權限為私有

錯誤示例:訪問class中默認權限下的成員。

4.1.4 案例1:立方體類

題目:設計立方體類,求出立方體的面積和體積,分別用全局函數和成員函數判斷兩個立方體是否相等

代碼如下:

#include <iostream>
using namespace std;class Cube
{
private://屬性:長寬高int l;int w;int h;public://設置\獲取屬性void setLong(int ll){l=ll;}int getLong(){return l;}void setWidth(int ww){w=ww;}int getWidth(){return w;}void setHeight(int hh){h=hh;}int getHeight(){return h;}//方法:計算面積、體積、判斷兩個立方體是否相等int getSquare(){return 2*(l*h+h*w+h*w);}int getVolume(){return l*w*h;}//利用成員函數判斷兩個立方體是否相等void isEqual(Cube &c){if(l==c.getLong() && w==c.getWidth() && h==c.getHeight()){cout<<"兩個立方體相同"<<endl;}else{cout<<"兩個立方體不同"<<endl;}}
};//利用全局函數判斷兩個立方體是否相等
void isSame(Cube &c1,Cube &c2)
{if(c1.getLong()==c2.getLong() && c1.getWidth()==c2.getWidth() && c1.getHeight()==c2.getHeight()){cout<<"兩個立方體相同"<<endl;}else{cout<<"兩個立方體不同"<<endl;}
}int main()
{//創建對象Cube c1;c1.setLong(1);c1.setWidth(2);c1.setHeight(3);cout<<"c1的面積為:"<<c1.getSquare()<<endl;cout<<"c1的體積為:"<<c1.getVolume()<<endl;Cube c2;c2.setLong(1);c2.setWidth(2);c2.setHeight(3);//判斷兩個立方體是否相等isSame(c1,c2);c1.isEqual(c2);c2.setLong(2);isSame(c1,c2);c1.isEqual(c2);return 0;
}

輸出如下:

4.1.5 案例2:點和圓(分文件)

題目:設計一個圓形類和一個點類,計算點和圓的關系。

代碼如下:

#include <iostream>
using namespace std;//點類
class Point
{
private:int p_x;int p_y;public://設置/獲取X,Yvoid setX(int x){p_x=x;}int getX(){return p_x;}void setY(int y){p_y=y;}int getY(){return p_y;}
};//圓類
class Circle
{
private:    int c_r;//半徑Point center;//圓心public://設置/獲取半徑圓心void setR(int r){c_r=r;}int getR(){return c_r;}void setCer(Point cer){center=cer;}Point getCer(){return center;}
};//判斷點和圓的關系
void isInCircle(Circle &c,Point &p)
{int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());int rdist=c.getR() * c.getR();if(dist==rdist){cout<<"點在圓上"<<endl;}else if(dist>rdist){cout<<"點在圓外"<<endl;}else{cout<<"點在圓內"<<endl;}
}int main()
{//創建點對象和圓對象Point p;Circle c;Point center;//設置點的坐標p.setX(0);p.setY(0);//設置園的半徑及圓心的坐標c.setR(10);center.setX(10);center.setY(0);c.setCer(center);//判斷點與圓的關系isInCircle(c,p);return 0;
}

輸出如下:

分文件編寫:

point.h

#pragma once//防止頭文件重復包含
#include <iostream>
using namespace std;//點類
class Point
{
private:int p_x;int p_y;public://設置/獲取X,Yvoid setX(int x);int getX();void setY(int y);int getY();};

point.cpp

#include "point.h"//點類//設置/獲取X,Y
void Point::setX(int x)//Point::的作用是聲明該函數是Point作用域下的成員函數
{p_x=x;
}
int Point::getX()
{return p_x;
}void Point::setY(int y)
{p_y=y;
}
int Point::getY()
{return p_y;
}

circle.h

#pragma once
#include <iostream>
using namespace std;
#include "point.h"//圓類
class Circle
{
private:    int c_r;//半徑Point center;//圓心public://設置/獲取半徑圓心void setR(int r);int getR();void setCer(Point cer);Point getCer();};

circle.cpp

#include "circle.h"//圓類//設置/獲取半徑圓心
void Circle::setR(int r)
{c_r=r;
}
int Circle::getR()
{return c_r;
}void Circle::setCer(Point cer)
{center=cer;
}Point Circle::getCer()
{return center;
}

main.cpp

#include <iostream>
using namespace std;
#include "point.h"
#include "circle.h"//判斷點和圓的關系
void isInCircle(Circle &c,Point &p)
{int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());int rdist=c.getR() * c.getR();if(dist==rdist){cout<<"點在圓上"<<endl;}else if(dist>rdist){cout<<"點在圓外"<<endl;}else{cout<<"點在圓內"<<endl;}
}int main()
{//創建點對象和圓對象Point p;Circle c;Point center;//設置點的坐標p.setX(0);p.setY(0);//設置園的半徑及圓心的坐標c.setR(10);center.setX(10);center.setY(0);c.setCer(center);//判斷點與圓的關系isInCircle(c,p);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71823.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

運行OpenManus項目(使用Conda)

部署本項目需要具備一定的基礎&#xff1a;Linux基礎、需要安裝好Anaconda/Miniforge&#xff08;Python可以不裝好&#xff0c;直接新建虛擬環境的時候裝好即可&#xff09;&#xff0c;如果不裝Anaconda或者Miniforge&#xff0c;只裝過Python&#xff0c;需要確保Python是3.…

spring boot + vue 搭建環境

參考文檔&#xff1a;https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建環境 一、瀏覽器二、jd…

MPPT與PWM充電原理及區別詳解

MPPT&#xff08;最大功率點跟蹤&#xff09;和PWM&#xff08;脈寬調制&#xff09;是太陽能充電控制器中常用的兩種技術&#xff0c;它們在原理、效率和適用場景上有顯著區別。以下是兩者的詳細對比&#xff1a; 1. 工作原理 PWM&#xff08;脈寬調制&#xff09; 核心機制…

slam學習筆記9---ubuntu2004部署interactive_slam踩坑記錄

背景&#xff1a;interactive_slam是一款可用于離線優化點云地圖算法。部署安裝容易出問題&#xff0c;這里記錄一下。 一、安裝基本流程 絕大部分跟著readme走&#xff0c;g2o安裝使用apt安裝 interactive_slam depends on the following libraries:GL3W GLFW Dear ImGui p…

視覺圖像處理

在MATLAB中進行視覺圖像處理仿真通常涉及圖像增強、濾波、分割、特征提取等操作。以下是一個分步指南和示例代碼,幫助您快速入門: 1. MATLAB圖像處理基礎步驟 1.1 讀取和顯示圖像 % 讀取圖像(替換為實際文件路徑) img = imread(lena.jpg); % 顯示原圖 figure; subplot(2…

用java如何利用jieba進行分詞

在Java中使用jieba進行分詞&#xff0c;可以借助jieba的Java版本——jieba-analysis。jieba-analysis是一個基于jieba分詞算法的Java實現&#xff0c;支持精確模式、全模式和搜索引擎模式等多種分詞方式。 以下是使用jieba-analysis進行分詞的詳細步驟和示例代碼&#xff1a; …

【含文檔+PPT+源碼】Python爬蟲人口老齡化大數據分析平臺的設計與實現

項目介紹 本課程演示的是一款Python爬蟲人口老齡化大數據分析平臺的設計與實現&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Python學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本…

【A2DP】SBC 編解碼器互操作性要求詳解

目錄 一、SBC編解碼器互操作性概述 二、編解碼器特定信息元素(Codec Specific Information Elements) 2.1 采樣頻率(Sampling Frequency) 2.2 聲道模式(Channel Mode) 2.3 塊長度(Block Length) 2.4 子帶數量(Subbands) 2.5 分配方法(Allocation Method) 2…

Android雙親委派

下面是一份 Android 類加載器雙親委派機制的時序圖示例&#xff0c;描述了當應用調用 loadClass() 時&#xff0c;各個加載器之間的委派過程。 #mermaid-svg-rBdlhpD2uRjBPiG8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

記錄小白使用 Cursor 開發第一個微信小程序(二):創建項目、編譯、預覽、發布(250308)

文章目錄 記錄小白使用 Cursor 開發第一個微信小程序&#xff08;二&#xff09;&#xff1a;創建項目、編譯、預覽、發布&#xff08;250308&#xff09;一、創建項目1.1 生成提示詞1.2 生成代碼 二、編譯預覽2.1 導入項目2.2 編譯預覽 三、發布3.1 在微信開發者工具進行上傳3…

Linux系統管理二

目錄 一.遠程連接管理服務SSH 1.1 了解服務端和客戶端 1.2 了解端口號的設定 1.3 了解ssh服務的作用 1.4 ssh搭建服務 二.netstat 2.1 netstat簡介 2.2 netstat命令參數 2.3 常用命令參考 三.進程的檢測與控制 3.1 管道 3.1.1 什么是管道 3.1.2 管道的分類 3.1.3…

【Recon】Git源代碼泄露題目解題方法

CTF中Git源代碼泄露題目解題方法 1. 確認存在.git目錄泄露2. 下載完整的.git目錄3. 恢復Git倉庫歷史4. 查找Flag的常見位置5. 處理不完整的.git目錄6. 其他技巧示例流程 在CTF中遇到Git源代碼泄露題目時&#xff0c;通常可以通過以下步驟解決&#xff1a; 1. 確認存在.git目錄泄…

字符串 反轉函數reverse() 的錯誤用法

回文字符串 題目描述 如果一個字符串逆序后與正序相同&#xff0c;那么稱這個字符串為回文字符串。例如abcba是回文字符串&#xff0c;abcca不是回文字符串。 給定一個字符串&#xff0c;判斷它是否是回文字符串。 輸入描述 一個非空字符串&#xff08;長度不超過 50&#…

C#程序加密與解密Demo程序示例

目錄 一、加密程序功能介紹 1、加密用途 2、功能 3、程序說明 4、加密過程 5、授權的注冊文件保存方式 二、加密程序使用步驟 1、步驟一 ?編輯2、步驟二 3、步驟三 4、步驟四 三、核心代碼說明 1、獲取電腦CPU 信息 2、獲取硬盤卷標號 3、機器碼生成 3、 生成…

專題二串聯所有單詞的子串

1.題目 題目分析&#xff1a; 有一個字符串s和字符串數組&#xff0c;如何字符串數組里面的元素可以組成一個字符串&#xff0c;然后要在字符串里面找到連續子串跟組成的字符串一樣&#xff0c;返回起始地址。 2.算法原理 這道題可以把字符串數組的元素string看出char&#x…

scala類型檢測和轉換

在scala中關于類型的檢測的api一共有以下三個&#xff1a; &#xff08;1&#xff09;obj.isInstanceOf[T]&#xff1a;判斷 obj 是不是 T 類型。 &#xff08;2&#xff09;obj.asInstanceOf[T]&#xff1a;將 obj 強轉成 T 類型。 &#xff08;3&#xff09;classOf[T]&am…

【論文閱讀】VAD: Vectorized Scene Representation for Efficient Autonomous Driving

一、介紹 VAD是華科團隊設計的一個端到端無人駕駛框架&#xff0c;針對傳統的無人駕駛框架的模塊化設計的問題&#xff0c;該算法使用向量化的策略進行了端到端的實現。傳統的模塊化設計使得感知模塊完全依賴于感知模塊的計算結果&#xff0c;這一解耦實際上從規劃模塊的角度損…

探索Java多線程的核心概念與實踐技巧,帶你從入門到精通!

各位看官早安午安晚安呀 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習多線程編程-"掌握線程創建、管理與安全"&#xff1a; 上一節課程我們鋪墊了一系列的東西&#xff0c;引出來了我們的多…

互動多媒體項目 自行車互動

該項目為UE4 +自行車騎行速度 互動項目 結果預覽 : 1. 獲取自行車速度 這里使用的是Arduino單片機 + 霍爾傳感器 霍爾傳感器: 單片機完整代碼: #define HALL_PIN 2 // 霍爾傳感器連接到D2(中斷引腳) volatile unsigned long lastTime = 0; // …

STM32——GPIO介紹

GPIO(General-Purpose IO ports,通用輸入/輸出接口)模塊是STM32的外設接口的核心部分,用于感知外界信號(輸入模式)和控制外部設備(輸出模式),支持多種工作模式和配置選項。 1、GPIO 基本結構 STM32F407 的每個 GPIO 引腳均可獨立配置,主要特性包括: 9 組 GPIO 端口…