C++學習筆記(十一)

一、類和對象

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

C++認為萬事萬物皆為對象,對象上有其屬性和行為

例如:人可以作為對象,屬性有姓名、年齡、身高......,行為有走、吃、睡覺

? ? ? ? ? ?車也可以作為對象,屬性有輪胎、方向盤、車燈......,行為有載人

? ? ? ? ? ?具有相同性質的對象,我們可以抽象稱為類,人屬于人類,車屬于車類

1.1 封裝

1.1.1 封裝的意義

① 將屬性(成員屬性、成員變量)和行為(成員函數、成員方法)作為一個整體(成員),表現生活中的事物

② 將屬性和行為加以權限控制

封裝意義一:

#include <iostream>using namespace std;#define PI 3.14class Circle
{
public:int c_r;double calculate_zc(){return 2 * PI * c_r;}
};int main(int argc, char* argv[])
{Circle circle1;circle1.c_r = 10;cout << "圓的周長為:" << circle1.calculate_zc() << endl;
}

封裝意義二:

類在設計時,可以把屬性和行為放在不同的權限下加以控制

訪問權限有三種:

1. public 公共權限:成員 類內可以訪問 類外可以訪問? ? ? ??

2. protected 保護權限:成員 類內可以訪問 類外不可以訪問 子類可以訪問父類中的保護內容? ? ? ??

?3. private 私有權限:成員 類內可以訪問 類外不可以訪問 子類不可以訪問父類中的私有內容

1.1.2 struct和class的區別

在C++中struct和class唯一的區別就在于默認的訪問權限不同

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

1.1.3?成員屬性設置為私有

優點1:將所有成員屬性設置為私有,可以自己控制讀寫權限

優點2:對于寫權限,可以檢測數據的有效性

#include <iostream>
#include <string>using namespace std;class Student
{
private:string stu_Name; // 可讀可寫string stu_Num = "23S101111"; // 只讀int stu_Age; // 只寫public:void setName(string name) {stu_Name = name; // 可寫}string getName(){return stu_Name; // 可讀}string getNum(){return stu_Num; // 只讀}void setAge(int age){if (age < 0 || age>150) // 檢測數據有效性{cout << "年齡輸入有誤,已重置為0" << endl;stu_Age = 0;return;}stu_Age = age; // 只寫}
};int main(int argc, char* argv[])
{Student stu;stu.setName("張三");cout << stu.getName() << endl;// stu.stu_Num = "23S101111"; 報錯,不可寫cout << stu.getNum() << endl; stu.setAge(150);stu.setAge(151);// cout << stu.stu_Age << endl;  報錯,不可讀
}
#include <iostream>using namespace std;// 立方體類設計
// 1. 創建立方體類
// 2. 設計立方體屬性 獲取立方體的長寬高
// 3. 設計立方體行為 獲取立方體面積和體積
// 4. 分別利用全局函數和成員函數 判斷兩個立方體是否相等class Cube
{
private:double cube_L, cube_W, cube_H;public:void setL(double length){cube_L = length;}double getL(){return cube_L;}void setW(double width){cube_W = width;}double getW(){return cube_W;}void setH(double height){cube_H = height;}double getH(){return cube_H;}double calculate_S(){return  2 * (cube_L * cube_W + cube_L * cube_H + cube_W * cube_H);}double calculate_V(){return cube_L * cube_W * cube_H;}bool isSameByClass(Cube &cube){if (cube_L == cube.getL() && cube_W == cube.getW() && cube_H == cube.getH()){return	true;}return false;}
};bool isSame(Cube &cube_one, Cube &cube_two)
{if (cube_one.getL() == cube_two.getL() && cube_one.getW() == cube_two.getW() && cube_one.getH() == cube_two.getH()){return	true;}return false;
}int main(int argc, char* argv[])
{Cube cube_one;cube_one.setL(10);cube_one.setW(10);cube_one.setH(10);cout << "該立方體的表面積為:" << cube_one.calculate_S() << endl;cout << "該立方體的體積為:" << cube_one.calculate_V() << endl;Cube cube_two;cube_two.setL(10);cube_two.setW(10);cube_two.setH(11);cout << "該立方體的表面積為:" << cube_two.calculate_S() << endl;cout << "該立方體的體積為:" << cube_two.calculate_V() << endl;bool issame = isSame(cube_one, cube_two);issame == 1 ? cout << "全局函數判斷兩個立方體相同" : cout << "全局函數判斷兩個立方體不相同";cout << endl;bool issameByClass = cube_one.isSameByClass(cube_two);issameByClass == 1 ? cout << "成員函數判斷兩個立方體相同" : cout << "成員函數判斷兩個立方體不相同";cout << endl;
}

案例:判斷點和圓的關系(在一個類中將另一個類作為成員,將不同的類拆成不同的文件)

#include <iostream>
#include <cmath>using namespace std;class Point
{
private:double point_X;double point_Y;
public:void set_X(double x){point_X = x;}double get_X(){return point_X;}void set_Y(double y){point_Y = y;}double get_Y(){return point_Y;}
};class Circle
{
private:Point circleCenter;double circleR;
public:void setR(double r){circleR = r;}double getR(){return circleR;}void setCircleCentre(Point p){circleCenter = p;}Point getCircleCentre(){return circleCenter;}
};void isInCircle(Circle c, Point p)
{double distance;distance = sqrt(pow(c.getCircleCentre().get_X() - p.get_X(), 2) + pow(c.getCircleCentre().get_Y() - p.get_Y(), 2));if (distance == c.getR()){cout << "點在圓上" << endl;}else if (distance < c.getR()){cout << "點在圓內" << endl;}else{cout << "點在圓外" << endl;}
}int main(int argc, char* argv[])
{Point p;p.set_X(10);p.set_Y(11);Point centre;centre.set_X(10);centre.set_Y(0);Circle circle;circle.setCircleCentre(centre);circle.setR(10);isInCircle(circle, p);return 0;
}

如何把不同的類寫入不同的文件

在頭文件中創建一個point.h,源文件中創建一個point.cpp

point.h

#pragma once
#include <iostream>using namespace std;class Point
{
private:double point_X;double point_Y;
public:void set_X(double x);double get_X();void set_Y(double y);double get_Y();};

point.cpp

#include "point.h"void Point::set_X(double x)
{point_X = x;
}
double Point::get_X()
{return point_X;
}
void Point::set_Y(double y)
{point_Y = y;
}
double Point::get_Y()
{return point_Y;
}

在頭文件中創建一個circle.h,源文件中創建一個circle.cpp

circle.h

#pragma once
#include <iostream>
#include "point.h"using namespace std;class Circle
{
private:Point circleCenter;double circleR;
public:void setR(double r);double getR();void setCircleCentre(Point p);Point getCircleCentre();
};

circle.cpp

#include "circle.h"void Circle::setR(double r)
{circleR = r;
}
double Circle::getR()
{return circleR;
}
void Circle::setCircleCentre(Point p)
{circleCenter = p;
}
Point Circle::getCircleCentre()
{return circleCenter;
}

main.cpp

#include <iostream>
#include <cmath>
#include "circle.h"
#include "point.h"using namespace std;void isInCircle(Circle c, Point p)
{double distance;distance = sqrt(pow(c.getCircleCentre().get_X() - p.get_X(), 2) + pow(c.getCircleCentre().get_Y() - p.get_Y(), 2));if (distance == c.getR()){cout << "點在圓上" << endl;}else if (distance < c.getR()){cout << "點在圓內" << endl;}else{cout << "點在圓外" << endl;}
}int main(int argc, char* argv[])
{Point p;p.set_X(10);p.set_Y(9);Point centre;centre.set_X(10);centre.set_Y(0);Circle circle;circle.setCircleCentre(centre);circle.setR(10);isInCircle(circle, p);return 0;
}

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

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

相關文章

官網IDM下載和安裝的詳細步驟

目錄 一、IDM是什么 二、下載安裝 三、解決下載超時的問題 四、谷歌瀏覽器打開IDM插件 谷歌瀏覽器下載官網&#x1f447; 五、測試 六、資源包獲取 一、IDM是什么 IDM&#xff08;internet download manager&#xff09;是一個互聯網下載工具插件&#xff0c;常見于用…

要求CHATGPT高質量回答的藝術:提示工程技術的完整指南—第 29 章:ChatGPT 插件

要求CHATGPT高質量回答的藝術&#xff1a;提示工程技術的完整指南—第 29 章&#xff1a;ChatGPT 插件 這是 ChatGPT 的另一個圣杯。它將徹底改變你使用 ChatGPT 的方式。ChatGPT 插件本質上是將 ChatGPT 的功能擴展到文本輸出之外。它允許你上傳圖片、視頻、音頻和 CSV 文件&…

資深IT經理分享如何選擇商用遠控軟件三:評估產品方案匹配度

作為企業必要的IT管理和遠程辦公工具&#xff0c;遠程控制解決方案的挑選和采購是需要IT部門慎重考慮的。 對于具體如何在諸多產品中選擇合適的商用遠程控制解決方案&#xff0c;此前我們就分享了一位資深IT經理的相關經驗&#xff0c;目前已經涵蓋初期的業務需求調研&#xf…

【ESP32 IDF】ESP32移植u8g2庫,實現oled界面顯示

ESP32移植u8g2庫&#xff0c;實現oled界面顯示 1. 簡單描述2. 環境準備1. 硬件準備2. 軟件準備 3. IIC屏幕 【基于 ssd1362 256*64 】4. SPI屏幕 【基于 ssd1306 128*32】 1. 簡單描述 開發方式為 IDF5.0參考連接為 iic基于esp-idf移植使用u8g2 spi基于esp-idf移植使用u8g2 …

探索創意無限的Photoshop CC 2020Mac/Win版

作為一款功能強大的圖像處理軟件&#xff0c;Photoshop CC 2020&#xff08;簡稱PS 2020&#xff09;在全球范圍內備受設計師、攝影師和藝術家的喜愛和推崇。它不僅為用戶提供了豐富多樣的工具和功能&#xff0c;還不斷推出新的創意特效和改進的功能&#xff0c;讓用戶的創意無…

【數據結構和算法】擁有最多糖果的孩子

其他系列文章導航 Java基礎合集數據結構與算法合集 設計模式合集 多線程合集 分布式合集 ES合集 文章目錄 其他系列文章導航 文章目錄 前言 一、題目描述 二、題解 三、代碼 四、復雜度分析 前言 這是力扣的1431題&#xff0c;難度為簡單&#xff0c;解題方案有很多種&…

C# Solidworks二次開發:選擇管理器相關的API介紹

今天在講述主要內容之前&#xff0c;先說一個不太相關的問題。 我之前在其他文章中看到有一些朋友在問為什么獲取到的點位數據需要乘以1000進行單位轉換&#xff0c;其實原因是這樣的&#xff0c;在所有使用的API中如果沒有特殊說明&#xff0c;所有的長度單位都是米&#xff…

蘋果Vision Pro即將量產

據界面新聞消息&#xff0c;蘋果公司將在今年12月正式量產第一代MR&#xff08;混合現實&#xff09;產品Vision Pro。蘋果公司對Vision Pro寄予了厚望&#xff0c;預計首批備貨40萬臺左右&#xff0c;2024年的銷量目標是100萬臺&#xff0c;第三年達到1000萬臺。 蘋果的供應…

springboot + thymeleaf + layui 初嘗試

一、背景 公司運營的同事有個任務&#xff0c;提供一個數據文件給我&#xff0c;然后從數據庫中找出對應的加密串再導出來給他。這個活不算是很難&#xff0c;但時不時就會有需求。 同事給我的文件有時是給excel表格&#xff0c;每一行有4列&#xff0c;逗號隔開&#xff0c;…

編譯和使用WPS-ghrsst-to-intermediate生成SST

一、下載 V1.0 https://github.com/bbrashers/WPS-ghrsst-to-intermediate/tree/masterV1.5&#xff08;使用過程報錯&#xff0c;原因不詳&#xff0c;能正常使用的麻煩告知一下方法&#xff09; https://github.com/dmitryale/WPS-ghrsst-to-intermediate二、修改makefile…

【CVE 復現】CVE-2022-0185 fsconfig之整數溢出

影響版本&#xff1a;Linux-v5.1~v5.16.2 測試版本&#xff1a;Linux-5.11.22&#xff0c;由于懶得搞環境&#xff0c;所以直接用的 bsauce 大佬提供的 測試環境 看看 patch&#xff1a; diff --git a/fs/fs_context.c b/fs/fs_context.c index b7e43a780a625b..24ce12f0db32…

ResNeXt(2017)

文章目錄 Abstract1. Introductionformer workour work 2. Related Work多分支卷積網絡分組卷積壓縮卷積網絡Ensembling 3. Method3.1. Template3.2. Revisiting Simple Neurons3.3. Aggregated Transformations3.4. Model Capacity 4. Experiment 原文地址 源代碼 Abstract 我…

【python】vscode中選擇虛擬環境venv

vscode 怎么指定 python venv&#xff1f; 在VSCode中選擇Python解釋器&#xff1a; 打開命令面板&#xff1a;按下 CtrlShiftP&#xff08;Windows/Linux&#xff09;或 CmdShiftP&#xff08;Mac&#xff09;。在命令面板中&#xff0c;鍵入 “Python: Select Interpreter”…

14.Java程序設計-基于Springboot的高校社團管理系統設計與實現

摘要 隨著高校社團活動的不斷豐富和社團數量的逐漸增加&#xff0c;高校社團管理面臨著日益復雜的挑戰。為了提高社團管理的效率和透明度&#xff0c;本研究基于Spring Boot框架設計并實現了一套高校社團管理系統。該系統旨在整合社團創建、成員管理、活動發布等多個功能&…

水位線和窗口

水位線特點 插入到數據流中的一個標記&#xff0c;可以認為是一個特殊的數據主要內容是一個時間戳水位線是基于數據的時間戳生成的&#xff0c;即事件時間水位線必須單調遞增水位線可以通過設置延遲&#xff0c;來保證正確處理亂序數據一個水位線&#xff0c;表示事件時間已經…

[FPGA 學習記錄] 數碼管動態顯示

數碼管動態顯示 文章目錄 1 理論學習1.1 數碼管動態掃描顯示原理 2 實戰演練2.1 實驗目標2.2 程序設計2.2.1 框圖繪制2.2.2 數據生成模塊 data_gen2.2.2.1 波形繪制2.2.2.2 代碼編寫2.2.2.3 代碼編譯2.2.2.4 邏輯仿真2.2.2.4.1 仿真代碼編寫2.2.2.4.2 仿真代碼編譯2.2.2.4.3 波…

如何解決el-table中動態添加固定列時出現的行錯位

問題描述 在使用el-table組件時&#xff0c;我們有時需要根據用戶的操作動態地添加或刪除一些固定列&#xff0c;例如操作列或選擇列。但是&#xff0c;當我們使用v-if指令來控制固定列的顯示或隱藏時&#xff0c;可能會出現表格的行錯位的問題&#xff0c;即固定列和非固定列…

el-tree數據量過大,造成瀏覽器卡死、崩潰

el-tree數據量過大&#xff0c;造成瀏覽器卡死、崩潰 場景&#xff1a;樹形結構展示&#xff0c;數據超級多&#xff0c;超過萬條&#xff0c;每次打開都會崩潰 我這里采用的是引入新的插件虛擬樹&#xff0c;它是參照element-plus 中TreeV2改造vue2.x版本虛擬化樹形控件&…

2024年強烈推薦mac 讀寫NTFS工具Tuxera NTFS for Mac2023中文破解版

大家好啊&#xff5e;今天要給大家推薦的是 Tuxera NTFS for Mac2023中文破解版&#xff01; 小可愛們肯定知道&#xff0c;Mac系統一直以來都有一個小小的痛點&#xff0c;就是無法直接讀寫NTFS格式的移動硬盤和U盤。但是&#xff0c;有了Tuxera NTFS for Mac2023&#xff0c;…

正則表達式:字符串處理的瑞士軍刀

&#x1f90d; 前端開發工程師&#xff08;主業&#xff09;、技術博主&#xff08;副業&#xff09;、已過CET6 &#x1f368; 阿珊和她的貓_CSDN個人主頁 &#x1f560; 牛客高級專題作者、在牛客打造高質量專欄《前端面試必備》 &#x1f35a; 藍橋云課簽約作者、已在藍橋云…