精品日本亚洲一区二区三区,99久久精品免费观看国产,99久久免费精品,亚洲精品国产一区二区成人,日本亚洲精品一区二区三区四区,国产亚洲精品成人久久网站,久久亚洲男人第一AV网站,精品国产高清一区二区广区,久久精品五月天很黄很艳女TV

考研論壇

 
查看: 655|回復: 2
打印 上一主題 下一主題

[其它] [師圓其說]--用C實現面向對象。(轉載)

[復制鏈接]

241

主題

1萬

帖子

0

積分

新手上路

蜀小時候可帥咯。

Rank: 1

精華
3
威望
7309
K幣
8435 元
注冊時間
2011-5-26
1
發表于 2013-3-5 00:33 | |閱讀模式
本帖最后由 天生最帥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++的面向對象保持一致的.
龍游淺水勿自棄,終有揚眉吐氣天。

241

主題

1萬

帖子

0

積分

新手上路

蜀小時候可帥咯。

Rank: 1

精華
3
威望
7309
K幣
8435 元
注冊時間
2011-5-26
2
 樓主| 發表于 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++構造和析構,還有其他更正規的方法。

龍游淺水勿自棄,終有揚眉吐氣天。

241

主題

1萬

帖子

0

積分

新手上路

蜀小時候可帥咯。

Rank: 1

精華
3
威望
7309
K幣
8435 元
注冊時間
2011-5-26
3
 樓主| 發表于 2013-3-5 00:57 |

三對,你明白的。
龍游淺水勿自棄,終有揚眉吐氣天。
關閉

您還剩5次免費下載資料的機會哦~

掃描二維碼下載資料

使用手機端考研幫,進入掃一掃
在“我”中打開掃一掃,
掃描二維碼下載資料

關于我們|商務合作|小黑屋|手機版|聯系我們|服務條款|隱私保護|幫學堂| 網站地圖|院校地圖|漏洞提交|考研幫

GMT+8, 2026-4-30 00:01 , Processed in 0.101876 second(s), Total 16, Slave 15(Usage:6.5M, Links:[2]1,1_1) queries , Redis On.

Powered by Discuz!

© 2001-2017 考研 Inc.

快速回復 返回頂部 返回列表
× 關閉