C++入門自學Day2-- c++類與對象(初識)

一、面向對象和面向過程

1、什么是面向過程(Process-Oriented Programming, POP)

📌 定義

  • 面向過程強調的是?過程(過程=函數),即:按照步驟(流程)組織代碼

  • 程序結構 = 數據結構 + 操作這些數據的函數。

  • 程序的主要設計思想是:先干什么,再干什么,順序執行,遇事用函數搞定

📌 特點

  • 數據與函數分離

  • 強調模塊化、函數復用

  • 程序結構清晰,適合小項目或底層開發

  • 缺乏對復雜數據結構的抽象能力

  • C 語言是典型的面向過程語言:關注過程,分析求解問題的步驟,通過函數調用逐步解決問題。

  • struct Student {char name[20];int age;
    };void printStudent(struct Student s) {printf("%s %d\n", s.name, s.age);
    }int main() {struct Student s = {"Tom", 20};printStudent(s); // 操作結構體由外部函數處理
    }

2、什么是面向對象(Object-Oriented Programming, OOP)?

📌 定義

  • 面向對象強調的是“對象(object)”:

    把數據和操作這些數據的方法封裝成一個整體(類),對象是類的實例。

📌 核心特性(C++ 支持)

特性

含義

封裝

數據和函數封裝在類中,提高安全性與模塊化

繼承

子類自動繼承父類成員,提高復用性

多態

同一個接口有不同表現形式(如虛函數)

?C++ 是支持面向對象的語言:關注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成

class Student {
public:string name;int age;void print() {cout << name << " " << age << endl;}
};int main() {Student s;s.name = "Tom";s.age = 20;s.print();  // 數據和方法封裝在類內部
}

3、兩種范式對比總結

比點

面向過程(C)

面向對象(C++)

編程核心

函數、流程

對象、類

數據與函數

分離

封裝在一起

適用場景

小型、過程性、底層開發

中大型、復雜、維護性強項目

可擴展性

典型語言

C

C++、Java、Python(OOP)

面向過程強調“做什么”,面向對象強調“誰來做”;
C 是“寫過程”的語言,C++ 是“建模型”的語言。

二、c++類的引入

????????c語言中,結構體只能定義變量,在c++中,結構體內不僅可以定義變量,也可以定義函數。

1、類的基本語法和使用

直接定義:

//類里面可以定義:1成員變量,2成員方法(函數)class Person {
public: //訪問限定符--公有void showInfo(){cout<< _name<<"-"<<_sex<<"-"<<_age<<"-"<<endl;}public:           // 訪問權限char* _name;  // 成員變量char* _sex;int _age;
};

分開定義,在頭文件中聲明,cpp中定義

頭文件中的聲明:


class Person {
public://訪問限定符--公有//顯示基本信息void showInfo();public:           // 訪問權限char* _name;  // 成員變量int _age;char* _sex;};

cpp文件的定義

#include "class.h"void Person::showInfo(){cout<< _name<<"-"<<_sex<<"-"<<_age<<"-"<<endl;
}

c++類的訪問限定符

關鍵字

說明

public

類外可訪問

private

類外不可訪問,僅類內和友元函數可訪問

protected

類外不可訪問,派生類可訪問

默認訪問權限:class?默認是?private,struct?默認是?public。struct也可以定義類。

利用類實現數據結構中的棧等

//利用類實現數據結構中的棧。
class Stack{public:void STInit(){//..../}void STpush(int x){//..../}void STpop(){//..../}void PrintST(){//..../}void Destroy(){//..../}private:int Top;int* _arr;int _capacity;
};int main(){Stack ST;ST.STInit(10);ST.STpush(1);ST.STpush(10);
}

c語言結構體和c++結構體定義的區別:

? ? ? ? c++中,兼容c的struct的定義結構體的方法,但同時struct也可以用來定義類。

????????struct所定義的類 默認是?public, class 定義的類默認是private 。

????????

//c語言用于定義結構體
struct ListNodeC{struct ListNodeC* prev;struct ListNodeC* next;
};
//c++定義結構體
struct ListNodeCPP{//同時也可以定義類ListNodeCPP* prev;ListNodeCPP* next;//這里仍然可以定義函數->成員函數ListNodeCPP* Creat();
}

c++ 兼容 c語言的用法。

類的內存占用

class Stack{//1、成員函數
public:void Push(int x); //函數的聲明void Pop(); //函數可以在類中定義,也可以在類外定義。  bool IsEmpty();//2、成員變量
public:int* _arr;int _size;size_t _capactity;};int main(){//類實例化出對象,相當于定義出類的成員變量Stack s1;Stack s2;Stack s3;// s1.Push(1);cout << sizeof(s1) << endl;//計算內存占用大小return 0;
}

輸出如下:

24 --> macos arm64架構下,int* 占用8個字節

根據內存對齊:

  • int*?要求 8 字節對齊

  • int?要求 4 字節對齊

  • 所以整體對齊到 8 的倍數

共24字節。那也就是成員函數不占字節

原因:一個類可以實例化n個對象,每個成員變量都可以存儲不同的值,但是調用的函數確是同一個。所以成員函數不占類對象的內存,成員函數是?代碼段(.text 段),與對象無關。

????????所以:sizeof(類對象)?只與?成員變量?有關,與成員函數無關

當我們的類中,成員變量為空,成員函數為空的情況下,內存大小是多少呢?

class A2{public:void f1();
};class A3{};int main(){cout << sizeof(A2) << endl;cout << sizeof(A3) << endl;return 0;
}

輸出結果:

1

1

1?? C++標準規定:

每個對象必須有唯一地址

  • 如果類的大小是?0,那多個對象就可能共享同一塊地址(比如全都指向空地址?0x1234)

  • 為了保證對象在內存中“可區分”,編譯器會強制空類占用至少 1 字節

2?? 類中只有函數時,仍然認為“沒有數據成員”

  • 成員函數是**代碼段(text segment)**的一部分,不存儲在對象中

  • 所以?A2?仍然是空類(empty class),編譯器仍然會分配?1 字節

類的實例化 --> 就是用自己定義的類型定義出對象

1、內置類型,基本類型 int/char/double

2、自定義類型,class/struct。

面向對象的三大特性:封裝,繼承,多態。

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

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

相關文章

DAO組織智能合約開發:從理論到實踐

目錄 DAO組織智能合約開發:從理論到實踐 1. DAO概述:去中心化自治組織 2. DAO核心組件設計 2.1 架構設計 2.2 關鍵智能合約 3. 治理代幣實現 3.1 ERC20擴展合約 4. 提案管理系統實現 4.1 提案狀態機 4.2 提案合約實現 5. DAO核心合約實現 5.1 DAO合約架構 5.2 提案類型擴展 6…

Ubuntu系統完整配置教程

Ubuntu系統完整配置教程 目錄 配置鏡像源安裝網絡服務虛擬機中安裝CUDAPython開發環境配置Java開發環境配置 1. 配置鏡像源 1.1 備份原始源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup1.2 編輯源文件 sudo nano /etc/apt/sources.list1.3 各大鏡像源…

【mysql慢查詢】

mysql慢查詢慢查詢慢查詢日志配置慢查詢 慢查詢是指執行時間超過指定閾值的SQL語句。在MySQL中&#xff0c;默認情況下執行時間超過10秒的查詢會被認為是慢查詢&#xff0c;但這個閾值可以根據需要進行調整。 慢查詢日志配置 -- 查看當前慢查詢配置 SHOW VARIABLES LIKE slo…

django 按照外鍵排序

在Django中&#xff0c;使用外鍵&#xff08;ForeignKey&#xff09;進行排序是一種常見的需求&#xff0c;特別是在處理數據庫關系時&#xff0c;如用戶和訂單之間的關系&#xff08;一個用戶有多個訂單&#xff09;。下面是如何在使用Django ORM時進行基于外鍵的排序。 定義模…

JAVA_EIGHTEEN_特殊文件

目錄 Properties屬性文件 XML的作用和應用場景 日志技術 Properties屬性文件 約束&#xff1a;只能是鍵值對 鍵不能重復 文件后綴一般是.properties結尾的 是一個Map集合&#xff08;鍵值對集合&#xff09; 核心作用&#xff1a;Properties是用來代表屬性文件的&#…

第二十二節 MATLAB轉置向量、MATLAB追加向量

MATLAB中轉置操作能夠將一個行向量改變成一個列向量&#xff0c;反之亦然。MATLAB中轉置操作使用一個單引號&#xff08;&#xff09;來表示。詳細例子在MATLAB中建立一個腳本文件&#xff0c;輸入下述代碼&#xff1a;r [ 1 2 3 4 ]; tr r; v [1;2;3;4]; tv v; disp(tr); …

window顯示驅動開發—Direct3D 11 視頻設備驅動程序接口 (DDI)

這些設備驅動程序接口 (DDI) 是新的或針對Windows 8更新的&#xff1a;CalcPrivateCryptoSessionSizeCalcPrivateAuthenticatedChannelSizeCalcPrivateVideoDecoderOutputViewSizeCalcPrivateVideoDecoderSizeCalcPrivateVideoProcessorEnumSizeCalcPrivateVideoProcessorInput…

新手向:用AI破解數據質量難題

用AI破解數據質量難題&#xff1a;從零開始的完整指南數據質量的重要性及其影響數據質量是數據分析、機器學習和業務流程中不可忽視的核心問題。低質量數據會導致一系列嚴重后果&#xff1a;錯誤決策&#xff1a;基于不準確或缺失的數據可能導致管理層做出錯誤判斷。例如&#…

用 Python 獲取電腦電池電量的各種案例

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 方法一:使用 `psutil` 庫(跨平臺) 方法二:Windows 專用方法(使用 `win32api`) 方法三:macOS 專用方法 方法四:Linux 專用方法 方法五:跨平臺統一方法 Python 程序案例:檢測電池電量并在低于20%時關機 以下…

Linux->自定義shell

目錄 引入&#xff1a; 1&#xff1a;shell是什么&#xff1f; 2&#xff1a;命令行提示符是什么&#xff1f; 3&#xff1a;xshell是什么&#xff1f; 一&#xff1a;命令行提示符 二&#xff1a; 獲取用戶輸入 三&#xff1a;分割字符串 四&#xff1a;執行命令 五…

js中出現-8.881784197001252e-16這種(一個極其接近 0 的極小負數)的浮點數精度計數異常問題解決思路

你的代碼中出現 -8.881784197001252e-16&#xff08;一個極其接近 0 的極小負數&#xff09;的原因是 JavaScript 浮點數精度問題。具體來說&#xff0c;當你反復進行 加法 和 減法 時&#xff0c;由于浮點數在計算機中的存儲方式&#xff0c;可能會引入微小的誤差。一、問題情…

超詳細的 RustDesk 自建中繼節點教程

厭倦了商業遠程控制軟件的會員限制和功能閹割&#xff1f;渴望擁有一個自由掌控、安全可靠的遠程連接方案&#xff1f;開源軟件 RustDesk 正是你需要的答案&#xff01; 相信從事互聯網工作的你&#xff0c;一定對向日葵和ToDesk等商業遠程控制軟件并不陌生。然而&#xff0c;…

Spring Boot 2整合Druid的兩種方式

一、自定義整合Druid&#xff08;非Starter方式&#xff09;適用于需要完全手動控制配置的場景添加依賴&#xff08;pom.xml&#xff09;<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</ve…

鴻蒙Next-開發版本升級,API升級(例如API12升API16)

鴻蒙更新換代很快的&#xff0c;2025年1月&#xff0c;截至4月就有 DevEco Studio 5.0.2 Release 升級到 DevEco Studio 5.0.3 Release 升級到 DevEco Studio 5.0.4 Release&#xff0c;三次大版本更新。 作者也想在年前創建的項目中體驗一下新版本的特性&#xff0c;于是查看了…

樹莓派設置時區

查看當前時間 piraspberrypi-CM5:~ $ date Mon 28 Jul 09:22:38 BST 2025BST 指的是 British Summer Time&#xff0c;即英國夏令時&#xff08;UTC1&#xff09;。 所以這是英國&#xff08;倫敦等地&#xff09;在夏令時期間的本地時間&#xff0c;比標準的 UTC 時間快 1 小時…

C Primer Plus 第6版 編程練習——第13章(下)

8.編寫一個程序&#xff0c;以一個字符和任意文件名作為命令行參數。如果字符后面沒有參數&#xff0c;該程序讀取標 淮輸入;否則&#xff0c;程序依次打開每個文件并報告每個文件中該字符出現的次數。文件名和字符本身也要一同報告。程序應包含錯誤檢查&#xff0c;以確定參數…

王樹森推薦系統公開課

github&#xff1a;https://github.com/wangshusen/RecommenderSystem b站&#xff1a;推薦系統公開課——8小時完整版&#xff0c;講解工業界真實的推薦系統_嗶哩嗶哩_bilibili 知乎上一個比較全面的筆記&#xff1a;https://zhuanlan.zhihu.com/p/678664853 我的筆記&…

<RT1176系列11>DMAMUX解讀

1、概述DMA&#xff08;直接內存訪問&#xff0c;DIrect Memory Access&#xff09;工作原理&#xff1a;DMA控制器直接在內存和外設之間傳輸數據&#xff0c;而不需要CPU的干預。優點&#xff1a;極大地提高了數據傳輸效率&#xff0c;釋放CPU資源。適合大批量數據傳輸&#x…

【MySQL】MySQL 緩存方案

一、MySQL主從同步 1.1 主從同步是什么 MySQL 主從同步是一種數據復制機制&#xff0c;通過該機制可以實現將主數據庫&#xff08;Master&#xff09;的 DDL&#xff08;數據定義語言&#xff09;和 DML&#xff08;數據操縱語言&#xff0c;如 update、insert、delete&#x…

base64.b64encode(f.read()).decode(‘utf-8‘)作用

base64.b64encode(f.read()).decode(utf-8) 的作用是將文件內容&#xff08;通常是二進制文件&#xff09;編碼為一個 UTF-8 格式的字符串。下面逐步解釋這個過程&#xff1a;f.read()&#xff1a;讀取文件 f 中的內容。這將返回文件的二進制數據。base64.b64encode()&#xff…