精品日本亚洲一区二区三区,伊人久久狼人色精品无码 ,日鲁夜鲁天天鲁视频,国产精品久久亚洲,秋霞理论理论福利院久久,国产日韩欧美视频一区二区三区,色九九,国产精品美女久久久久久免费 ,九九干,韩国精品一区二区三区
考研論壇
標題:
[師圓其說]--用C實現面向對象。(轉載)
[打印本頁]
作者:
天生最帥6
時間:
2013-3-5 00:33
標題:
[師圓其說]--用C實現面向對象。(轉載)
本帖最后由 天生最帥6 于 2013-3-5 00:38 編輯
C語言是面向過程的,也可以像C++一樣實現面向對象。
面向對象的本質是一種設計思想,與具體的語言沒有多大的關系。
請看C++的類與對象:
#include <iostream>
using namespace std;
class student
{
public:
int getNum()
{
cout<<num<<endl;
return 0;
};
private:
int num;
};
int main()
{
student one;
one.getNum();
return 0;
}
student one;
編譯器就為one 數據成員 int num; 分配了空間,
沒有為所謂 getNum()成員函數分配任何東西的。
如果用C來寫,就可以這樣寫:
#include <stdio.h>
struct student
{
int num;
};
int getNum(struct student* p)
{
printf("%d",p->num);
return 0;
};
int main()
{
struct student one;
getNum(&one);
return 0;
}
用C寫的這段code與C++寫的那段code本質基本等效。
不過,有人要說了,C++聲明的student類會有構造函數及析構函數,C語言沒有。
OK,我們先給C++加上一個構造函數。
#include <iostream>
using namespace std;
class student
{
public:
student(int number=0)
{
num = number;
cout<<num<<endl;
};//代替getNum();
private:
int num;
};
int main()
{
student one(1);
return 0;
}
在定義一個student one(1);時, 構造函數就會被調用了。
構造函數是怎么被調用的呢?我們好象看不到調用?
其實是因為編譯器在生成代碼的時候,已經在定義后面加入了調用的代碼了,這個過程程序員沒有參與。
等效于:
student one; //定義一個對象
student(1); //調用構造函數,由編譯器加入的代碼。
明白這點,那么,我們的C語言也可以寫構造函數了。
#include <stdio.h>
struct student
{
int num;
};
void student(int number, struct student * p)
{
p->num = number;
printf("%d\n",p->num);
};
int main()
{
struct student one; //定義一個結構體對象
student(1, &one); //構造函數
return 0;
}
用C語言實現面向對象有以下幾點:
1. 在內存分配上,struct 類型與class類型數據是一樣的,都只是存儲數據的。
類的成員函數跟普通函數是一樣編譯存儲的。
它所以能跟類關聯在一起,實際是由編譯器在保證的。
用C語言寫的時候,關聯性由程序員控制。
2. 構造函數與析構函數的調用,其實是由編譯器調用。
編譯器在生成最終的二進制代碼的時候,加入了它們的調用代碼。類的其他特性也是如此。
3. 類的訪問控制private, public, protected特性是由編譯器保證的。最終生成的代碼沒有這些屬性。
4. 用C實現面向對象,就是把C++中由編譯器所做的部分工作,轉嫁由程序員來做。
這樣造成的結果就是程序員多寫一點代碼而已。
在編譯生成的最終匯編代碼中,C所實現的面向對象是可以與C++的面向對象保持一致的.
作者:
天生最帥6
時間:
2013-3-5 00:41
本帖最后由 天生最帥6 于 2013-3-5 01:08 編輯
//main.h
#include <iostream>
using namespace std;
class Obj
{
public :
Obj() { cout << "Initialization of obj" << endl; }
~Obj() { cout << "Destroy of ~obj" << endl; }
void Initialize() { cout << "Initialization of Initialize" << endl; }
void Destroy() { cout << "Destroy of Destroy" << endl; }
};
void UseMallocFree()
{
Obj *a = (Obj *) malloc( sizeof( Obj ) ); // allocate memory
a->Initialize(); // initialization
cout<<"UseMallocFree()"<<endl;
a->Destroy();// deconstruction
free(a); // release memory
};
void UseNewDelete()
{
Obj *a = new Obj;
cout<<"UseNewDeltee()"<<endl;
delete a;
};
////////////////////////////////////////////////////////////
//main.cpp
#include "main.h"
int main()
{
Obj obj;//自動調用系統obj和~obj構造和析構函數
UseNewDelete();
//手動調用NewDelete()函數并調用Initialize()
和Destroy()函數。
UseMallocFree();
//手動調用UseMallocFree()函數并自動obj構造和~obj析構。
return 0;
}
同樣實現了C模擬C++構造和析構,還有其他更正規的方法。
作者:
天生最帥6
時間:
2013-3-5 00:57
構造和析構.JPG
(29.37 KB, 下載次數: 73)
下載附件
2013-3-5 00:56 上傳
三對,你明白的。
歡迎光臨 考研論壇 (http://www.5522pp.com/)
Powered by Discuz! X3.2