50.C++物件模型的分析(上)(C語言實現物件導向特性)
兩者差別僅僅時訪問許可權。
- 類本質上是結構體
驗證:
class A
{
int i;
int j;
char c;
double d;
public:
void print()
{
cout << "i = " << i << ", "
<< "j = " << j << ", "
<< "c = " << c << ", "
<< "d = " << d << endl;
}
};
struct B
{
int i;
int j;
char c;
double d;
};
int main()
{
B* p = reinterpret_cast<B*>(&a);//改變a的記憶體性質
p->i = 1;
p->j = 2;
p->c = 'c';
p->d = 3;
a.print();
return 0;
}
輸出結果為1 2 c 3
- C++中的類
#include <iostream>
#include <string>
using namespace std;
class Demo
{
int mi;
int mj;
public:
Demo(int i, int j)
{
mi = i;
mj = j;
}
int getI()
{
return mi;
}
int getJ()
{
return mj;
}
int add(int value)
{
return mi + mj + value;
}
};
int main()
{
Demo d(1, 2);
cout << "sizeof(d) = " << sizeof(d) << endl;
cout << "d.getI() = " << d.getI() << endl;
cout << "d.getJ() = " << d.getJ() << endl;
cout << "d.add(3) = " << d.add(3) << endl;
return 0;
}
輸出結果顯而易見
- 用C語言實現上面的物件導向特性
#include "50-2.h"
#include "malloc.h"
struct ClassDemo
{
int mi;
int mj;
};
Demo* Demo_Create(int i, int j)
{
struct ClassDemo* ret = (struct ClassDemo*)malloc(sizeof(struct ClassDemo));
if( ret != NULL )
{
ret->mi = i;
ret->mj = j;
}
return ret;
}
int Demo_GetI(Demo* pThis)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mi;
}
int Demo_GetJ(Demo* pThis)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mj;
}
int Demo_Add(Demo* pThis, int value)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mi + obj->mj + value;
}
void Demo_Free(Demo* pThis)
{
free(pThis);
}
#ifndef _50_2_H_
#define _50_2_H_
typedef void Demo;
Demo* Demo_Create(int i, int j);
int Demo_GetI(Demo* pThis);
int Demo_GetJ(Demo* pThis);
int Demo_Add(Demo* pThis, int value);
void Demo_Free(Demo* pThis);
#endif
#include <stdio.h>
#include "50-2.h"
int main()
{
Demo* d = Demo_Create(1, 2); // Demo* d = new Demo(1, 2);
printf("d.mi = %d\n", Demo_GetI(d)); // d->getI();
printf("d.mj = %d\n", Demo_GetJ(d)); // d->getJ();
printf("Add(3) = %d\n", Demo_Add(d, 3)); // d->add(3);
// d->mi = 100;
Demo_Free(d);
return 0;
}
列印結果也為1 2 6
若編寫:d->mi = 100;會報錯,從物件導向的角度看,這是私有成員變數,沒有辦法訪問改寫,進行private的模擬。
這裡的typedef void Demo;很巧秒
相關文章
- OOC 物件導向 C 語言程式設計實踐物件程式設計
- 真的可以,用C語言實現物件導向程式設計OOPC語言物件程式設計OOP
- C++物件導向特性實現機制的初步分析 Part3 (轉)C++物件
- C++物件導向特性實現機制的初步分析 Part1 (轉)C++物件
- R語言物件導向指南R語言物件
- C語言大型軟體設計的物件導向C語言物件
- C++物件導向三大特性C++物件
- Java語言之物件導向—類與物件(上)Java物件
- Go 是物件導向的語言嗎?Go物件
- golang 物件導向特性Golang物件
- 物件導向(上)物件
- 物件導向有哪些特性物件
- C#物件導向三大特性總結C#物件
- 設計模式(二):物件導向及其特性分析設計模式物件
- java物件導向(上)Java物件
- Lua 中實現物件導向物件
- golang物件導向分析Golang物件
- Objective-C——實現物件導向程式設計Object物件程式設計
- 『Java 語法基礎』物件導向有哪些特性Java物件
- 物件導向-物件導向思想物件
- 一步步分析:C語言如何物件導向程式設計C語言物件程式設計
- Java物件導向三大特性Java物件
- 08 ### 物件導向三大特性物件
- GO 語言中的物件導向Go物件
- JavaScript物件導向—繼承的實現JavaScript物件繼承
- Python物件導向(上)Python物件
- Javascript實現物件導向繼承JavaScript物件繼承
- 第十八章 物件導向的特性物件
- Go 語言極速入門4 - 物件導向Go物件
- C++ 物件導向 一C++物件
- 物件導向建模分析(一)物件
- Objective-C 物件導向(一)——物件的本質Object物件
- iOS 開發之 OOA (物件導向分析) & OOD (物件導向設計)& OOP (物件導向程式設計)iOS物件OOP程式設計
- javascript的物件導向的繼承實現JavaScript物件繼承
- 物件導向 -- 三大特性之多型物件多型
- Python物件導向三大特性Python物件
- 物件導向,搞定物件物件
- C++ 物件導向的三大特性和五個原則C++物件