嵌入式八股C語言---面向對象篇

面向對象與面向過程

  • 面向過程
    就是把整個業務邏輯分成多個步驟,每步或每一個功能都可以使用一個函數來實現
  • 面向對象
    對象是類的實例化,此時一個類就內部有屬性和相應的方法

封裝

??在C語言里實現封裝就是實現一個結構體,里面包括的成員變量和函數指針,然后在構造函數中,為結構體的函數指針賦初值
對于這個函數指針往往會把自身傳入,因為只是在模仿class

#include <stdio.h>
#include <stdlib.h>
struct student
{int height;char* name;void(*add_height)(struct student *, int);
};void ADD_HEIGHT(struct student * stu, int add)
{stu->height += add;
}
struct student * Student(int height,char *name)
{struct student * stu = malloc(sizeof(struct student));if(stu) {stu->height = height;stu->name = name;stu->add_height = ADD_HEIGHT;}return stu;
}
void freeStudent(struct student * stu )
{if(stu) {free(stu);stu = NULL;}
}
int main()
{struct student * stu = Student(180,"LCS");printf("%d\r\n",stu->height);stu->add_height(stu,50);printf("%d\r\n",stu->height);return 0;
}

繼承

  • 實現方案一: 子類中嵌套父類結構體指針
    C語言模仿繼承就是子類的結構體里嵌套一個父類的結構體
    那如何實現類似虛函數的效果呢–修改父類的函數指針的指向就行
 		#include <stdio.h>#include <stdlib.h>struct animal{/* data */int age;void (*speak)(void);};void cat_speak() {printf("speak miaomiao\r\n");}void dog_speak() {printf("speak wangwang\r\n");}struct cat {struct animal * anm;int like_nothing;};struct dog {struct animal * anm;int like_eat_shit;};struct animal* Animal(int age) {struct animal* anm = malloc(sizeof(struct animal));anm->age = age;anm->speak = NULL;return anm;}struct cat* Cat(int age) {struct cat* new_cat = malloc(sizeof(struct cat));new_cat->anm = Animal(age); // 這就意味著等會你釋放內存是真麻煩new_cat->like_nothing = 1;new_cat->anm->speak = cat_speak;return new_cat;}struct dog* Dog(int age) {struct dog* new_dog = malloc(sizeof(struct dog));new_dog->anm = Animal(age); // 這就意味著等會你釋放內存是真麻煩new_dog->like_eat_shit = 1;new_dog->anm->speak = dog_speak;return new_dog;}int main(){struct cat* new_cat = Cat(5);struct dog* new_dog = Dog(10);new_cat->anm->speak();new_dog->anm->speak();return 0;}
  • 繼承的妙用: struct list_head 雙向鏈表
    ??當我們想要實現自己的列表的實現 就把自己的鏈表中嵌入這個雙向列表就行
  • 實現方案二: 父類提供一個void * 私有指針 不同的子類把void * 做不同的實現
#include <stdio.h>
#include <stdlib.h>// 基類定義
typedef struct {int age;void (*speak)(void*); // 虛函數指針void* private_data;   // 用于存儲子類特定數據
} Animal;// Cat的私有數據結構
typedef struct {int like_nothing;
} CatPrivate;// Dog的私有數據結構
typedef struct {int like_eat_shit;
} DogPrivate;// 實現虛函數:貓叫聲
static void cat_speak(void* obj) {CatPrivate* private_data = ((Animal*)obj)->private_data;printf("Cat says: miaomiao, like_nothing=%d\n", private_data->like_nothing);
}// 實現虛函數:狗叫聲
static void dog_speak(void* obj) {DogPrivate* private_data = ((Animal*)obj)->private_data;printf("Dog says: wangwang, like_eat_shit=%d\n", private_data->like_eat_shit);
}// 創建Animal實例
Animal* create_animal(int age, void (*speak_func)(void*), void* private_data) {Animal* animal = malloc(sizeof(Animal));animal->age = age;animal->speak = speak_func;animal->private_data = private_data; // 設置私有數據return animal;
}// 創建Cat實例
Animal* create_cat(int age) {CatPrivate* cat_private = malloc(sizeof(CatPrivate));cat_private->like_nothing = 1; // 設定Cat私有數據Animal* animal = create_animal(age, cat_speak, cat_private);return animal;
}// 創建Dog實例
Animal* create_dog(int age) {DogPrivate* dog_private = malloc(sizeof(DogPrivate));dog_private->like_eat_shit = 1; // 設定Dog私有數據Animal* animal = create_animal(age, dog_speak, dog_private);return animal;
}int main() {Animal* new_cat = create_cat(5);Animal* new_dog = create_dog(10);// 調用虛函數new_cat->speak(new_cat);new_dog->speak(new_dog);// 清理資源free(((CatPrivate*)new_cat->private_data));free(((DogPrivate*)new_dog->private_data));free(new_cat);free(new_dog);return 0;
}
  • 繼承與抽象類
    ??含有純虛函數的類,我們一般稱之為抽象類。抽象類不能被實例化,實例化也沒有意義,唯一的好處就是代碼分層

  • 公共繼承 私有繼承 保護繼承
    在這里插入圖片描述

  • 組合優于繼承?

多態

??用父類指針調用子類的成員函數
??那就是給結構體的成員變量的函數指針指向不同的函數

深淺拷貝

??淺拷貝只是對指針的拷貝,拷貝后兩個指針指向同一個內存空間,
??深拷貝不但對指針進行拷貝,而且對指針指向的內容進行拷貝,經深拷貝后的指針是指向兩個不同地址的指針

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

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

相關文章

Distilling the Knowledge in a Neural Network知識蒸餾

一.知識蒸餾的定義 1. 量化VS蒸餾 量化&#xff1a;減小精度 例如參數float32—>float16蒸餾&#xff1a;Student model模仿Teacher model,在保持較高性能的同時&#xff0c;減少模型大小和計算復雜度的技術。 二.知識蒸餾步驟 1.教師模型訓練: 訓練一個大型且復雜的神…

靜態程序分析

參考&#xff1a;https://github.com/RangerNJU/Static-Program-Analysis-Book/blob/master/SUMMARY.md 課件&#xff1a;https://pascal-group.bitbucket.io/teaching.html 視頻&#xff1a;南京大學《軟件分析》課程01&#xff08;Introduction&#xff09;_嗶哩嗶哩_bilib…

Flutter_學習記錄_device_info_plus 插件獲取設備信息

引入三方庫device_info_plus導入頭文件 import package:device_info_plus/device_info_plus.dart;獲取設備信息的主要代碼 DeviceInfoPlugin deviceInfoPlugin DeviceInfoPlugin(); BaseDeviceInfo deviceInfo await deviceInfoPlugin.deviceInfo;完整案例 import package…

日有所得-google 瀏覽器離線安裝

一、目標&#xff1a; 基于UOS系統進行瀏覽器插件開發&#xff0c;目標展現形式為側欄 二、背景&#xff1a; UOS操作系統需支持1032及以上版本 瀏覽器插件基于google瀏覽器&#xff0c;自帶360等瀏覽器能兼容基于google瀏覽器開發的插件 JS庫借用Vue庫以提高效率 三、問…

高效自動化測試:打造Python+Requests+Pytest+Allure+YAML的接口測試框架

一、背景 在快節奏的開發周期中&#xff0c;如何確保接口質量&#xff1f;自動化測試是關鍵。通過構建標準化、可復用的測試框架&#xff0c;能顯著提升測試效率與準確性&#xff0c;為項目質量保駕護航[1][7]。 二、目標 ? 核心目標&#xff1a; ● 實現快速、高效的接口測試…

談談List,Set,Map的區別

List、Set 和 Map 是 Java 集合框架&#xff08;Java Collections Framework&#xff09;中的三種主要接口&#xff0c;它們各自有不同的特點和用途。以下是它們的區別和使用場景的詳細解釋&#xff1a; 1. List&#xff08;列表&#xff09; 1.1 特點 有序集合&#xff1a;Li…

智能運維管理系統的主要優勢

智能運維管理系統通過整合大數據、人工智能、機器學習等技術&#xff0c;顯著提升了IT運維的效率和質量。以下是智能運維管理系統的主要優勢&#xff1a; 一、提升運維效率 1.自動化運維 自動執行重復性任務&#xff08;如日志分析、故障排查、系統備份&#xff09;&#xf…

分享一個用來解決運維問題的 AI 提示詞

模板如下&#xff08;每次我都是自己寫的&#xff0c;但是感覺可以更加調優一些&#xff09; 我遇到了如下問題<問題的清晰描述>你是一位資深運維工程師&#xff0c;任務是指導我一步步排查并解決上面的問題排查過程中&#xff0c;你給我操作指示&#xff0c;我將操作的…

【python運行Janus-Pro-1B文生圖功能】

前言 體驗了一把本地部署Janus-Pro-1B實現文生圖功能。 1、開源項目下載 官方開源項目代碼直接從Github上下載。 2、模型下載 模型官方下載需要魔法 Janus-Pro-1B模型文件&#xff1a;Janus-Pro-1B模型文件 百度網盤&#xff1a; https://pan.baidu.com/s/16t4H4z-QZe2UDAg4…

跨越時空的對話:圖靈與GPT-4聊AI的前世今生

&#xff08;背景&#xff1a;虛擬咖啡廳&#xff0c;圖靈身著1950年代西裝&#xff0c;端著一杯熱茶&#xff0c;GPT-4以全息投影形態坐在對面&#xff09; 圖靈&#xff08;喝了口茶&#xff09;&#xff1a;“聽說你能寫詩&#xff1f;我當年在布萊切利園破解Enigma時&…

L2-4 吉利矩陣

輸入樣例&#xff1a; 7 3輸出樣例&#xff1a; 666 這道題是暴力純搜&#xff0c;但是很難想&#xff0c;我這個是看的別人的代碼 #include "bits/stdc.h" using namespace std; int x[20][20]; int l, n; int cnt 0; int sumx[5], sumy[5]; void dfs(int x, in…

Quickwit+Jaeger+Prometheus+Grafana搭建Java日志管理平臺

介紹 生產服務應用可觀測性在當下比較流行的方案&#xff0c;其中出現了大量高性能、開箱即用、易上手的的開源產品&#xff0c;大大豐富了在可觀測性領域產品的多樣性&#xff0c;本文講述基于OTLP協議推送Java項目遙測數據&#xff08;日志、指標、鏈路&#xff09;到后端存儲…

SpringMVC (一)基礎

目錄 SpringMVC 一 簡單使用 1 新建模塊選擇指定參數 2 創建實現類 3 將項目啟動 4 運行結果&#xff1a;在瀏覽器當中響應執行 二 RequestMapping 三 請求限定 SpringMVC SpringMVC是Spring的web模塊&#xff0c;用來開發Web應用&#xff0c;SpringMVC應用最終作為B/…

【機器人-基礎知識】歐拉角、旋轉矩陣和四元數

1. 歐拉角 1.1. 歐拉角的定義 歐拉角是一組三個角度,用于描述一個剛體在三維空間中的定向關系。具體來說,它們表示從一個固定參考坐標系到剛體坐標系的一系列旋轉。常見的定義方式是將總體旋轉分解為三個連續的簡單旋轉,每次旋轉都繞著當前坐標系的某一固定軸進行。 例如,…

xxl-job部署在docker-destop,實現定時發送預警信息給指定郵箱

XXL-JOB XXL-JOB是一個分布式任務調度平臺&#xff08;XXL是作者徐雪里姓名拼音的首字母&#xff09;&#xff0c;其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。 源碼倉庫地址&#xff1a;https://github.com/xuxueli/xxl-job 源碼結構&#xff1a; 系統架構 在xxl-j…

大數據學習(63)- Zookeeper詳解

&&大數據學習&& &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一下博主哦&#x1f91e; &#x1f…

【數據結構】3順序表

0 章節 &#xff12;&#xff0e;&#xff11;到&#xff12;&#xff0e;&#xff13;小節。 理解與表達線性表的邏輯結構&#xff1b; 線性表的結構、結構與操作&#xff1b; 順序表的表示與實現&#xff1b;順序表應用&#xff1b; 重點 線性表概念、順序表定義運算與實現&a…

CUDA編程之OpenCV與CUDA結合使用

OpenCV與CUDA的結合使用可顯著提升圖像處理性能。 一、版本匹配與環境配置 CUDA與OpenCV版本兼容性? OpenCV各版本對CUDA的支持存在差異&#xff0c;例如OpenCV 4.5.4需搭配CUDA 10.0?2&#xff0c;而較新的OpenCV 4.8.0需使用更高版本CUDA?。 需注意部分模塊&#xff08;…

WPF從初學者到專家:實戰項目經驗分享與總結

WPF從初學者到專家&#xff1a;實戰項目經驗分享與總結 一、前言二、WPF 基礎概念與入門2.1 什么是 WPF2.2 XAML 基礎2.3 數據綁定基礎 三、第一個 WPF 項目&#xff1a;簡單的待辦事項列表3.1 項目需求分析3.2 項目搭建與界面設計3.3 業務邏輯實現 四、中級項目&#xff1a;音…

一學就會的深度學習基礎指令及操作步驟(3)模型訓練驗證

文章目錄 模型訓練驗證損失函數和優化器模型優化訓練函數驗證函數模型保存 模型訓練驗證 損失函數和優化器 loss_function nn.CrossEntropyLoss() # 損失函數 optimizer Adam(model.parameters()) # 優化器&#xff0c;優化參數模型優化 獲得模型所有的可訓練參數&#x…