成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從C語言實現(xiàn)面向?qū)ο筇骄緾lass的秘密

開發(fā) 前端
那你有沒有想過,它的底層是怎么實現(xiàn)的?為什么不同對象,設置了不同的number和grade,它的輸出卻不一樣?

這里我想主要介紹下在C語言中是如何實現(xiàn)的面向?qū)ο?。知道了C語言實現(xiàn)面向?qū)ο蟮姆绞?,我們再?lián)想下,C++中的class的運行原理是什么?

首先我們來寫一段C++的class,拿一個Student類來舉例子:

在頭文件中,我定義一個Student類:

#pragma once
class Student {
public:
void SetNumber(int number);
void SetGrade(int grade);
void Print();
private:
int number;
int grade;
};

再在源文件中實現(xiàn)它:

#include "studentpp.h"
#include <stdio.h>
void Student::SetNumber(int number) { this->number = number; }
void Student::SetGrade(int grade) { this->grade = grade; }
void Student::Print() { printf("studentpp number : %d, grade : %d \n", this->number, this->grade);}

接下來是使用Student類:

#include <iostream>
#include "studentpp.h"
int main() {
Student *stu1 = new Student;
Student *stu2 = new Student;
stu1->SetNumber(11);
stu2->SetNumber(22);
stu1->SetGrade(111);
stu2->SetGrade(222);
stu1->Print();
stu2->Print();
delete stu1;
delete stu2;
}

我們再運行一下,運行結(jié)果不出所料。

那你有沒有想過,它的底層是怎么實現(xiàn)的?為什么不同對象,設置了不同的number和grade,它的輸出卻不一樣?

這個問題我們先放在這。等我用C語言實現(xiàn)一套這種方案后,估計你就明白了。

首先,在頭文件中定義一個C語言的結(jié)構(gòu)體Student:

#pragma once
typedef struct Student Student;
Student* CreateStudent();
void DestroyStudent(Student* student);
void SetNumber(Student* student, int number);
void SetGrade(Student* student, int grade);
void Print(Student* student);

注意在這里我使用了一個typedef,即Student = struct Student;

但是我卻沒有在頭文件中定義它:

struct Student {
int number;
int grade;
};

我把它放在了源文件中,在源文件中定義它,再實現(xiàn)相關(guān)的方法。

#include "student.h"
#include <stdlib.h>
#include <stdio.h>

struct Student {
int number;
int grade;
};

Student* CreateStudent() {
Student* self = (Student*)malloc(sizeof(Student));
return self;
}

void DestroyStudent(Student* student) {
if (!student) return;
free((void*)student);
}

void SetNumber(Student* student, int number) {
if (!student) return;
student->number = number;
}

void SetGrade(Student* student, int grade) {
if (!student) return;
student->grade = grade;
}

void Print(Student* student) {
if (!student) return;
printf("student number : %d, grade : %d \n", student->number, student->grade);
}

然后使用它:

#include "student.h"

int main() {
Student* stu1 = CreateStudent();
Student* stu2 = CreateStudent();
SetNumber(stu1, 11);
SetNumber(stu2, 22);
SetGrade(stu1, 111);
SetGrade(stu2, 222);
Print(stu1);
Print(stu2);
DestroyStudent(stu1);
DestroyStudent(stu2);
}

這是不是面向?qū)ο蟮脑恚繑?shù)據(jù)封裝到了不同的指針下,不同的指針傳到了相同的函數(shù)中,行為也會不同。

這時候我們再聯(lián)想一下C++中的面向?qū)ο笫遣灰彩沁@個原理:

平時我們使用的:

a->Print();

其實它的原理可能是這樣的:

void Print(Student* this) {
this->number;
this->grade;
}

只不過編譯器把默認的這個this參數(shù)隱藏在內(nèi)部,我們看不見而已。其實每個成員函數(shù)默認都會有一個參數(shù),就是對象的指針,也就是this指針。到這里你應該也就明白面向?qū)ο蟮脑砹税伞?/p>

注意在這里我使用了一個typedef,即Student = struct Student;

但是我卻沒有在頭文件中定義它。

這樣可以更好的隱藏Student的實現(xiàn),外面不知道Student究竟是什么東西,只有內(nèi)部知道。在頭文件中對外只暴露Student的指針,然后指針傳到源文件中,再去解析它。

比如,我在其它地方想要得到Student的大小,編譯器會報錯,沒法使用sizeof,因為它不知道Student,它只知道它是不完整的類型。而只能在源文件中使用sizeof。

這種設計是不是比C++的class更安全一些,確實安全,其實C++也可以這樣實現(xiàn),就是可以使用pImpl指針。

責任編輯:武曉燕 來源: 程序喵大人
相關(guān)推薦

2020-07-24 09:40:04

C語言OOP代碼

2022-10-21 09:01:41

StudentC++類型

2020-04-15 11:07:31

C語言對象思想

2010-08-24 16:00:43

C語言

2011-06-02 09:47:11

C語言重構(gòu)

2010-03-22 17:30:18

Python對象

2010-01-22 10:26:40

C++語言

2013-02-21 17:02:00

C語言

2010-01-13 14:05:55

C++語言

2022-08-27 10:53:15

C語言Linux內(nèi)核

2010-02-05 15:59:26

C++函數(shù)重載

2024-05-27 00:00:00

C# 類參數(shù)數(shù)據(jù)

2010-03-01 17:47:53

Python語言

2023-12-07 12:59:46

C語言循環(huán)隊列代碼

2009-12-22 01:54:50

C++之父Bjarne Stro

2010-01-15 19:17:48

C++語言

2024-04-02 07:32:58

Go語言接口

2009-07-14 16:51:50

Jython中的對象

2010-01-25 18:05:40

C++語言

2023-12-08 07:59:41

對象設計設計模式軟件設計
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99精品视频免费观看 | 亚洲精品视频播放 | 亚洲一区二区三区福利 | 日韩精品视频在线 | 国产精品一码二码三码在线 | 91精品国产综合久久久久久丝袜 | 日本a视频 | 五月婷六月丁香 | 在线区 | 国产91综合 | 久久成人免费 | 中文字幕国 | 激情91 | 夜久久 | 福利视频三区 | k8久久久一区二区三区 | 日韩av中文 | av在线亚洲天堂 | 亚洲一区久久 | 免费小视频在线观看 | 中文字幕视频一区 | 九九久久99| 一级黄色片日本 | 国产精品揄拍一区二区久久国内亚洲精 | 国产高清免费 | 成人国产精品免费观看 | 黄色在线观看国产 | 色男人天堂av | 精品一区二区在线观看 | 亚洲欧美aⅴ | 国产精品一区二区三区四区五区 | 一区观看 | 精品久久影院 | 精精国产xxxx视频在线野外 | 国产成人av电影 | 国产成人网 | 久久在线看 | 欧美一区二区成人 | 精品久久久久久 | 国产精品久久久久久网站 | 欧美日韩视频一区二区 |