㈠ 用純粹的C語言能實現面向對象編程嗎
當然可以!
面向對象本身是一種思想,而用哪種語言實現只是一種技術手段。事實上思想和技術的關系本身就是class和object的關系。
classoo{
//這是面向對象的思想類
};
oojava;//java是oo的一個具體的技術實現
oocxx;//c++是oo的一個具體的技術實現
拿Windows系統來講,它是有C語言編寫的,但是使用的卻是面向對象的思想,這方面可以參考reactos(一個免費開源的用於大學教授操作系統原理的windows系統)。
舉一個例子也許更實際一些,比如,操作系統有兩種操作界面,一種是GUI界面,一種是控制台界面,在windows平台上編寫一個程序,在cmd中運行時,執行控制台界面的代碼,在GUI中運行的時候,執行圖形界面的代碼。這實際上也算是一種面向對象編程中的多態實例。以下示例代碼在vc6.0編譯通過。
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
#include<TLHELP32.H>
charwhat_shell_run()
{
HANDLEhSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnap==0){
return_T('E');
}
PROCESSENTRY32pe32={0};
pe32.dwSize=sizeofpe32;
DWORDdwSelfPid=GetCurrentProcessId();
DWORDdwParentPid=~0;
for(BOOLbLoop=Process32First(hSnap,&pe32);bLoop!=FALSE;bLoop=Process32Next(hSnap,&pe32))
{
if(dwSelfPid==pe32.th32ProcessID){
dwParentPid=pe32.th32ParentProcessID;
break;
}
}
if(dwParentPid==~0)return_T('U');
for(bLoop=Process32First(hSnap,&pe32);bLoop!=FALSE;bLoop=Process32Next(hSnap,&pe32))
{
if(dwParentPid==pe32.th32ProcessID){
if(lstrcmpi(pe32.szExeFile,_T("cmd.exe"))==0)
{
CloseHandle(hSnap);
return_T('C');
}elseif(lstrcmpi(pe32.szExeFile,_T("explorer.exe"))==0){
CloseHandle(hSnap);
return_T('G');
}
}
}
CloseHandle(hSnap);
return_T('U');
}
voidconsole(void){
printf("這是一控制台程序 ");
}
voidgui(void){
MessageBox(0,_T("這是一個GUI程序"),_T("GUI"),MB_OK);
}
intmain()
{
charch=what_shell_run();
switch(ch)
{
case'C':
console();break;
case'G':
gui();break;
}
return0;
}
在cmd中運行該程序的結果:
㈡ 在C語言中,什麼叫做面向對象,什麼叫做面向過程
面向對象和面向過程都是編程思想,分別以對象和過程為主要目標進行編程。
1、面向對象:面向對象(ObjectOriented)是一種軟體開發方法。ObjectOriented的概念和應用已經超越了編程和軟體開發。面向對象是一種理解和抽象現實世界的方法。它是計算機編程技術發展的產物。
2、面向過程:面向過程(Procere Oriented)是一種以過程為中心的編程思想。面向過程都是以正在發生的過程為主要目標進行編程,與面向對象明顯的不同就是封裝、繼承、類。
(2)c面向對象編程實例擴展閱讀:
面向對象和面向過程的區別:
1、分析問題方式的不同:
面向過程是分析解決問題所需的步驟,然後使用函數逐步實現這些步驟,使用時一個接一個。
面向對象是將問題事務分解為各種對象。對象的建立不是為了完成一個步驟,而是為了描述一個事物在解決問題的整個過程中的行為。
2、解決問題的方法的不同:
面向過程其實是最為實際的一種思考方式,就算是面向對象的方法也是含有面向過程的思想。可以說面向過程是一種基礎的方法。它考慮的是實際地實現。一般的面向過程是從上往下步步求精,所以面向過程最重要的是模塊化的思想方法。
對比面向過程,面向對象的方法主要是把事物給對象化,對象包括屬性與行為。當程序規模不是很大時,面向過程的方法還會體現出一種優勢。
參考資料來源:網路-面向對象
參考資料來源:網路-面向過程
㈢ 為什麼C語言不能按照面向對象的思想來編程。
當然可以用C語言進行面向對象編程。
面向對象本身是一種思想,而用哪種語言實現只是一種技術手段。事實上思想和技術的關系本身就是class和object的關系。
class oo {
//這是面向對象的思想類
};
oo java; //java是oo的一個具體的技術實現
oo cxx; //c++是oo的一個具體的技術實現
拿Windows系統來講,它是有C語言編寫的,但是使用的卻是面向對象的思想,這方面可以參考reactos(一個免費開源的用於大學教授操作系統原理的windows系統)。
舉一個例子也許更實際一些,比如,操作系統有兩種操作界面,一種是GUI界面,一種是控制台界面,在windows平台上編寫一個程序,在cmd中運行時,執行控制台界面的代碼,在GUI中運行的時候,執行圖形界面的代碼。這實際上也算是一種面向對象編程中的多態實例。以下示例代碼在vc6.0編譯通過。
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
#include<TLHELP32.H>
charwhat_shell_run()
{
HANDLEhSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnap==0){
return_T('E');
}
PROCESSENTRY32pe32={0};
pe32.dwSize=sizeofpe32;
DWORDdwSelfPid=GetCurrentProcessId();
DWORDdwParentPid=~0;
for(BOOLbLoop=Process32First(hSnap,&pe32);bLoop!=FALSE;bLoop=Process32Next(hSnap,&pe32))
{
if(dwSelfPid==pe32.th32ProcessID){
dwParentPid=pe32.th32ParentProcessID;
break;
}
}
if(dwParentPid==~0)return_T('U');
for(bLoop=Process32First(hSnap,&pe32);bLoop!=FALSE;bLoop=Process32Next(hSnap,&pe32))
{
if(dwParentPid==pe32.th32ProcessID){
if(lstrcmpi(pe32.szExeFile,_T("cmd.exe"))==0)
{
CloseHandle(hSnap);
return_T('C');
}elseif(lstrcmpi(pe32.szExeFile,_T("explorer.exe"))==0){
CloseHandle(hSnap);
return_T('G');
}
}
}
CloseHandle(hSnap);
return_T('U');
}
voidconsole(void){
printf("這是一控制台程序 ");
}
voidgui(void){
MessageBox(0,_T("這是一個GUI程序"),_T("GUI"),MB_OK);
}
intmain()
{
charch=what_shell_run();
switch(ch)
{
case'C':
console();break;
case'G':
gui();break;
}
return0;
}
㈣ 急求:在c++函數中調用c函數的程序例子,具體的程序
如果是自己寫的函數的話,代碼直接復制過去就行了,C++ 向下兼容的,C函數可以直接被編譯。
如果調用別人用C寫好的庫,就要用
extern "C" {
//C類型庫函數調用
...
}
這是因為C++語言在編譯的時候為了解決函數的多態問題,會將函數名和參數聯合起來生成一個中間的函數名稱,而C語言則不會,因此會造成鏈接時找不到對應函數的情況,此時C函數就需要用extern 「C」進行鏈接指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈接的中間函數名。
㈤ 如何用C語言實現面向對象
可以通過以下方法實現面向對象:
1、封裝
封裝就是把數據和方法打包到一個類裡面。其實C語言編程者應該都已經接觸過了,C 標准庫 中的 fopen(), fclose(), fread(), fwrite()等函數的操作對象就是 FILE。
數據內容就是 FILE,數據的讀寫操作就是 fread()、fwrite(),fopen() 類比於構造函數,fclose() 就是析構函數。
2、繼承
繼承就是基於現有的一個類去定義一個新類,這樣有助於重用代碼,更好的組織代碼。在 C 語言裡面,去實現單繼承也非常簡單,只要把基類放到繼承類的第一個數據成員的位置就行了。
例如,我們現在要創建一個 Rectangle 類,我們只要繼承 Shape 類已經存在的屬性和操作,再添加不同於 Shape 的屬性和操作到 Rectangle 中。
3、多態 C++
語言實現多態就是使用虛函數。在 C 語言裡面,也可以實現多態。 現在,我們又要增加一個圓形,並且在 Shape 要擴展功能,我們要增加 area() 和 draw() 函數。
但是 Shape 相當於抽象類,不知道怎麼去計算自己的面積,更不知道怎麼去畫出來自己。而且,矩形和圓形的面積計算方式和幾何圖像也是不一樣的。
4、虛表和虛指針
虛表(Virtual Table)是這個類所有虛函數的函數指針的集合。
虛指針(Virtual Pointer)是一個指向虛表的指針。這個虛指針必須存在於每個對象實例中,會被所有子類繼承。
5、在構造函數中設置vptr
在每一個對象實例中,vptr 必須被初始化指向其 vtbl。最好的初始化位置就是在類的構造函數中。
事實上,在構造函數中,C++ 編譯器隱式的創建了一個初始化的vptr。在 C 語言裡面, 我們必須顯示的初始化vptr。下面就展示一下,在 Shape 的構造函數裡面,如何去初始化這個 vptr。
㈥ C語言什麼是面向過程,什麼是面向對象啊求解析,舉個例子
C語言是面向過程。你了解下面向對象就知道區別了,「對象」大概就是一個程序的零部件,就是把一些函數、欄位、屬性(你暫時就想是C語言的一些函數和變數吧)包裝在一起,這么做的好處是什麼,利於重用,便於管理,好理解,總之好處一坨。就好比一輛車的一個部件,要換就換嗎,不會影響到整個程序的框架吧。 要深入還是比較抽象的,建議學C的時候順便看下C++或者其他面向對象語言 從網上找個項目看看。實踐學的比較快。如果要學習資料的話可以留郵箱,發點給你。
㈦ 如何用C語言實現面向對象編程
相對於PASCAL、C一類的語言都是面向過程的語言。它的運行順序是固定的(按順序執行)。但C++面向對象,也就是說它的運行隨著你的觸發。假如你現在按了一個按鈕,那麼程序就會運行觸發按鈕的相應函數,所以它並不是按順序執行的。