8. C++ 面向對象之特性一(封裝)

面向對象主要包括三大類:封裝,繼承,多態

1.類和對象

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

人可以作為對象,屬性有姓名、年齡、身高、體重...,行為有走、跑、跳、吃飯、唱歌...
車也可以作為對象,屬性有輪胎、方向盤、車燈...,行為有載人、放音樂、放空調...
具有相同性質的==對象==,我們可以抽象稱為==類==,人屬于人類,車屬于車類

對象是類的實例。

2.封裝

1.封裝的意義

1. 將屬性和行為統一為一個整體,表現為生活中的事物

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

封裝意義一:
將屬性和行為統一為一個整體,表現為生活中的事物
語法: class 類名{ 訪問權限: 屬性 / 行為 };

示例1:設計一個圓類,求圓的周長

沒學封裝之前,用C語言實現:

#include<stdio.h>
double circleCaculate(double r)
{return 3.14*r*r;
}
int main(int argc, char const *argv[])
{double r = 1.2;double area = circleCaculate(r);return 0;
}

在這里面r相當于屬性,circleCaculate()相當于行為,在C語言里屬性和行為是分開的;

用封裝實現

#include<iostream>
using namespace std;
class Circle
{
public:                 //protected  private  權限int r;              // 屬性double circleCaculate()     // 行為{return 3.14*r*r;}
};
int main(int argc, char const *argv[])
{Circle c;           //  Circle是類  c是對象c.r = 1.2;area = c.circleCaculate();cout<<area<<endl;return 0;
}

類不占內存,但可以用sizeof計算出它的大小,對象才占內存。

示例2:設計一個學生類,屬性有姓名和學號,可以給姓名和學號賦值,可以顯示學生的姓名和學

//學生類
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;}public:string m_name;int m_id;};
int main() {Student stu;stu.setName("德瑪西亞");stu.setID(250);stu.showStudent();system("pause");return 0;
}
封裝意義二:
可以把屬性和行為放在不同的權限下,加以控制

訪問權限有三種:
1. public 公共權限
2. protected 保護權限
3. private 私有權限

//三種權限
//公共權限 public 類內可以訪問 類外可以訪問
//保護權限 protected 類內可以訪問 類外不可以訪問
//私有權限 private 類內可以訪問 類外不可以訪問
class Person
{//姓名 公共權限public:string m_Name;//汽車 保護權限protected:string m_Car;//銀行卡密碼 私有權限private:int m_Password;public:void func(){m_Name = "張三";m_Car = "拖拉機";m_Password = 123456;}
};
int main() {Person p;p.m_Name = "李四";//p.m_Car = "奔馳"; //保護權限類外訪問不到//p.m_Password = 123; //私有權限類外訪問不到system("pause");return 0;
}

//三種權限
//公共權限 public 類內可以訪問 類外可以訪問
//保護權限 protected 類內可以訪問 類外不可以訪問
//私有權限 private 類內可以訪問 類外不可以訪問

2.struct和class區別

在C++中 struct和class唯一的區別就在于 默認的訪問權限不同
區別:
struct 默認權限為公共
class 默認權限為私有,如果想訪問必須明確為public權限

class C1
{int m_A; //默認是私有權限
};
struct C2
{int m_A; //默認是公共權限
};
int main() {C1 c1;c1.m_A = 10; //錯誤,訪問權限是私有C2 c2;c2.m_A = 10; //正確,訪問權限是公共system("pause");return 0;
}

3.成員屬性要設置為私有

優點1:將所有成員屬性設置為私有,可以自己控制讀寫權限
優點2:對于寫權限,我們可以檢測數據的有效性

class Person {public://姓名設置可讀可寫void setName(string name) {m_Name = name;}string getName(){return m_Name;}//獲取年齡int getAge() {return m_Age;}//設置年齡void setAge(int age) {if (age < 0 || age > 150) {cout << "你個老妖精!" << endl;return;}m_Age = age;}//情人設置為只寫void setLover(string lover) {m_Lover = lover;}private:string m_Name; //可讀可寫 姓名int m_Age; //只讀 年齡string m_Lover; //只寫 情人
};
int main() {Person p;//姓名設置p.setName("張三");cout << "姓名: " << p.getName() << endl;//年齡設置p.setAge(50);cout << "年齡: " << p.getAge() << endl;//情人設置p.setLover("蒼井");//cout << "情人: " << p.m_Lover << endl; //只寫屬性,不可以讀取system("pause");return 0;
}

4.類的聲明和定義

可以類的聲明,和類的定義分離,在.h文件中聲明,在.cpp文件中定義

用客戶端的代碼來舉例:

頭文件:

#ifndef CLIENT_H
#define CLIENT_H
#include<iostream>
#include <sys/types.h>      
#include <sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include <arpa/inet.h>
#include<cstdio>
#include<cstring>
#include<cstdlib>
class Tcpclient
{private:int sockfd;//臨時struct sockaddr_in server_addr;public:Tcpclient(const std::string& serverIp,short port);~Tcpclient();bool ConnectToServer();int SendToServer(const std::string& data);int RecvFromServer(char* buffer,int buffersize);};
#endif

client.cpp

#include<iostream>
#include"client.hpp"
using namespace std;Tcpclient::Tcpclient(const std::string& serverIp,short port){    //創建socketsockfd=socket(AF_INET,SOCK_STREAM,0);//ipv4 tcpif(sockfd<0){cerr<<"Failed to create socket"<<endl;sockfd=-1;return;}//服務的地址:IP 端口號server_addr.sin_family=AF_INET;server_addr.sin_port=htons(port);server_addr.sin_addr.s_addr=inet_addr(serverIp.c_str());
}
Tcpclient::~Tcpclient(){close(sockfd);
}
bool Tcpclient::ConnectToServer(){if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0){cerr<<"connect err"<<endl;return false;}cout<<"connect success!"<<endl;return true;
}
//
int Tcpclient::SendToServer(const std::string& data){return send(sockfd,data.c_str(),data.size(),0);
}
int Tcpclient::RecvFromServer(char* buffer,int buffersize){return recv(sockfd,buffer,buffersize,0);
}

main.cpp

#include"client.hpp"
using namespace std;
int main(int argc, char const *argv[])
{char buffer[1024]={0};Tcpclient tcp1("0.0.0.0",8082);tcp1.ConnectToServer();tcp1.SendToServer("hello");tcp1.RecvFromServer(buffer,sizeof(buffer));cout<<buffer<<endl;return 0;
}

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

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

相關文章

WebRtc02:WebRtc架構、目錄結構、運行機制

整體架構 WebRtc主要分為三層&#xff1a; CAPI層&#xff1a;外層調用Session管理核心層&#xff1a;包括視頻引擎、音頻引擎、網絡傳輸 可由使用者重寫視頻引擎&#xff1a;編解碼器、視頻緩存、視頻增強音頻引擎&#xff1a;編解碼器、音頻緩存、回音消除、降噪傳輸&#x…

【Qt】快速添加對應類所需的頭文件包含

快速添加對應類所需的頭文件包含 一&#xff0c;簡介二&#xff0c;操作步驟 一&#xff0c;簡介 本文介紹一下&#xff0c;如何快速添加對應類所需要包含的頭文件&#xff0c;可以提高開發效率&#xff0c;供參考。 二&#xff0c;操作步驟 以QTime類為例&#xff1a; 選中…

Apache MINA 反序列化漏洞CVE-2024-52046

漏洞描述&#xff1a; Apache MINA 是一個功能強大、靈活且高性能的網絡應用框架。它通過抽象網絡層的復雜性&#xff0c;提供了事件驅動架構和靈活的 Filter 鏈機制&#xff0c;使得開發者可以更容易地開發各種類型的網絡應用。 Apache MINA 框架的 ObjectSerializationDeco…

服務器docker配置過程

1.docker安裝 參考官方文檔&#xff1a;https://docker.cadn.net.cn/manuals/engine_install_ubuntu 2.docker鏡像源替換 官方文檔&#xff1a;https://cloud.tencent.com/document/product/1207/45596 鏡像源根據你租了哪家的去找官方文檔即可。

RabbitMQ通過代碼創建交換機和隊列

常見交換機 RabbitMQ提供的交換機一共的四種&#xff0c;分別是&#xff1a; 1. Fanout&#xff1a;采用廣播形式來發送消息&#xff0c;會將消息路由到所有綁定了的隊列之中。 2. Direct&#xff1a;通過Binding Key與隊列綁定&#xff0c;生產者在發送信息的時候會通過Routin…

js es6 reduce函數, 通過規格生成sku

const specs [{ name: 顏色, values: [紅色, 藍色, 綠色] },{ name: 尺寸, values: [S, M, L] } ];function generateSKUs(specs) {return specs.reduce((acc, spec) > {const newAcc [];for (const combination of acc) {for (const value of spec.values) {newAcc.push(…

WPF通過反射機制動態加載控件

Activator.CreateInstance 是 .NET 提供的一個靜態方法&#xff0c;它屬于 System 命名空間。此方法通過反射機制根據提供的類型信息。 寫一個小demo演示一下 要求&#xff1a;在用戶反饋界面點擊建議或者評分按鈕 彈出相應界面 編寫MainWindow.xmal 主窗體 <Window x:C…

寬帶、光貓、路由器、WiFi、光纖之間的關系

1、寬帶&#xff08;Broadband&#xff09; 1.1 寬帶的定義寬帶指的是一種高速互聯網接入技術&#xff0c;通常包括ADSL、光纖、4G/5G等不同類型的接入方式。寬帶的關鍵特點是能夠提供較高的數據傳輸速率&#xff0c;使得用戶可以享受到穩定的上網體驗。 1.2 寬帶的作用寬帶是…

Pytest鉤子函數,測試框架動態切換測試環境

在軟件測試中&#xff0c;測試環境的切換是個令人頭疼的問題。不同環境的配置不同&#xff0c;如何高效切換測試環境成為許多測試開發人員關注的重點。你是否希望在運行測試用例時&#xff0c;能夠動態選擇測試環境&#xff0c;而不是繁瑣地手動修改配置&#xff1f; Pytest 測…

印象筆記07——試一試PDF標注

印象筆記07——試一試PDF標注 [!CAUTION] 根據第六期&#xff0c;我再次查詢了資料&#xff0c;印象筆記還是有一些可圈可點的功能的&#xff08;當然部分有平替&#xff09;&#xff0c;針對會員作用&#xff0c;開發使用場景雖然是逆向的&#xff0c;但我堅信這是一部分人的現…

【Vue】分享一個快速入門的前端框架以及如何搭建

先上效果圖: 登錄 菜單: 下載地址: 鏈接&#xff1a;https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取碼&#xff1a;ui20 … 主要是可以自定義設置token,更改后端請求地址較為方便。 應用設置: 登錄與token設置: 在這里設置不用登錄,可以請求的接口: request.js i…

通過串口通信控制led燈的亮滅

初始化led燈的gpio接口控制燈的亮滅 初始化uart1串口 將gpio9和gpio10設置為復用模式進行串口通信 通過串口的輸入輸出函數實現串口通信控制led燈的亮滅

計算機xinput1_4.dll丟失怎么修復?

電腦運行時常見問題及修復指南 作為軟件開發從業者&#xff0c;深知電腦在日常使用中難免會遇到各種問題&#xff0c;如文件丟失、文件損壞和系統報錯等。這些問題不僅影響工作效率&#xff0c;還可能帶來數據丟失的風險。本文將詳細介紹一些常見問題及其解決辦法&#xff0c;…

DeepSeek V3“報錯家門”:我是ChatGPT

搜 &#xff1a;海訊無雙Ai 要說這兩天大模型圈的頂流話題&#xff0c;那絕對是非DeepSeek V3莫屬了。 不過在網友們紛紛測試之際&#xff0c;有個bug也成了熱議的焦點—— 只是少了一個問號&#xff0c;DeepSeek V3竟然稱自己是ChatGPT。 甚至讓它講個笑話&#xff0c;生成…

C++:范圍for

范圍for&#xff08;range-based for&#xff09;是C的一種循環結構&#xff0c; 是在 C11 這個標準中引入的&#xff0c;這種類型的for循環使得遍歷數組、容器中的元素更加簡便和直觀。 一、范圍for語法 for ( 類型 變量名 : 數組名 ) 語句 //多條語句需要加?括號 示例&#…

C++基礎概念復習

前言 本篇文章作基礎復習用&#xff0c;主要是在C學習中遇到的概念總結&#xff0c;后續會繼續補充。如有不足&#xff0c;請前輩指出&#xff0c;萬分感謝。 1、什么是封裝&#xff0c;有何優點&#xff0c;在C中如何體現封裝這一特性&#xff1f; 封裝是面向對象編程&…

前端工程化之手搓webpack5 --【elpis全棧項目】

前端工程化之手搓webpack5 --【elpis全棧項目】 導讀 基本流程&#xff1a;輸入 – 編譯 – 輸出 #mermaid-svg-V8Gi7RFNikCuEhax {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-V8Gi7RFNikCuEhax .error-icon{fil…

vue3使用setup語法糖組件基礎傳值

(1)&#xff1a;defineProps&#xff1a;傳入要使用的props定義自定義屬性&#xff0c;傳遞過來的值具有響應式&#xff0c;和props一樣&#xff1b; (2)&#xff1a;defineEimts&#xff1a;傳入要自定義的事件&#xff0c;emit實例去傳入自定義事件的值&#xff0c;和$emit或…

S7-200可用的modbus RTU完成位輪詢

網上的信息比較散&#xff0c;官方說明也不充分&#xff0c;尤其是涉及主站按需寫入的部分沒有見到現成案例。 以下記錄完成位輪詢讀取&#xff0c;同時按需寫入的程序。 初始化主站&#xff0c;初始化塊的完成位M9.3通過上升沿觸發一個M9.4&#xff0c;用于后面啟動輪詢。 第…

特征點檢測與匹配——MATLAB R2022b

特征點檢測與匹配在計算機視覺中的作用至關重要,它為圖像處理、物體識別、增強現實等領域提供了堅實的基礎。 目錄 Harris角點檢測 SIFT(尺度不變特征變換) SURF(加速穩健特征) ORB(Oriented FAST and Rotated BRIEF) 總結 特征點檢測與匹配是計算機視覺中的一項基…