類是C++中面向對象編程思想中比較重要的組成部分,與結構體一樣類只是一個模板只有在創建對象時才會申請內存空間,類其實是把具有共同特性的數據或方法(面向對象編程中,一般把函數稱為方法)都放在一起,用于創建對象時使用
創新互聯公司從2013年創立,是專業互聯網技術服務公司,擁有項目成都網站建設、成都網站制作網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元新洲做網站,已為上家服務,為新洲各地企業和個人服務,聯系電話:18982081108#include#includetypedef struct _myclass
{int a;
int b;
int(*max)(int c, int d);
int(*min)(int c, int d);
int(*addab)(struct _myclass *t);
} myclass;
int mbmax(int a, int b) {return (a >b ? a : b);
}
int mbmin(int a, int b) {return (b< a ? b : a);
}
int mbaddab(myclass *t) {return t->a + t->b;
}
//相當于C++的類構造函數,用于創建一個類實例,并初始化這個類 實例 ,構造函數命名采用類名init的方式。
myclass * myclassinit() {myclass *t = (myclass *)malloc(sizeof(myclass));
t->a = 1;
t->b = 1;
t->max = mbmax;
t->min = mbmin;
t->addab = mbaddab;
return t;
}
int main() {myclass *tt = myclassinit(); //類的創建方法只要一條語句就可以完成,達到了和C++中new類似的效果
printf("the max number is %d\n", tt->max(4, 8));
printf("the min number is %d\n", tt->min(4, 8));
printf("a plus b is %d\n", tt->addab(tt));
delete tt;
tt = nullptr;
return 0;
}
C語言結構體變量私有化有人說可以通過設置private使成員變量私有化,但如果這樣做那就真的“私有化”了。因為一般結構體都沒有成員函數(盡管可以有),因此如果設置成私有,那結構體外的所有函數都無法調用成員變量。其實我們這里說的私有是這些成員變量只能在結構體定義的源文件中使用,而不能被其他源文件使用。
解決方案:將結構體放進源文件中,頭文件只放聲明
這其實跟C的編譯有關,當結構體定義在頭文件中時,因為我們主函數所在的源文件(main.cpp)會include這個頭文件,而編譯時相當于將該頭文件的內容直接替換掉inlcude,那么main中或者其他include了該頭文件的函數都可以訪問結構體成員;但當結構體定義在源文件中時,編譯時沒有將結構體的定義復制過來,因此結構體成員在main中不可用,但因為在源文件中定義了結構體,因此該源文件下的所有函數均可以訪問結構體成員。
obj.h
#pragma once
#ifndef OBJ_H
#define OBJ_H
typedef struct Obj Obj;
Obj* create_obj(int id, const char* name);
void release_obj(Obj* &o);
int get_obj_id(const Obj* o);
char* get_obj_name(const Obj* o);
#endif
obj.cpp
#include "obj.h"
#include#includestruct Obj {int id;
char *name;
};
Obj* create_obj(int id, const char* name)
{Obj* ret = new Obj();
if (ret) {size_t len = 0;
ret->id = id;
len = strlen(name);
ret->name = new char[len + 1];
// ret->name = (char *) name;
if (ret->name)
{ memset(ret->name, 0, len + 1);//內存初始化
memcpy(ret->name, name, len);//內存賦值
}
}
return ret;
}
void release_obj(Obj* &o)//o為引用變量
{if (!o) return;
delete o->name;//釋放內存
o->name = nullptr;//釋放完畢要賦空指針
delete o;
o = nullptr;
}
int get_obj_id(const Obj* o)
{int ret = 0;
if (o)ret = o->id;
return ret;
}
char* get_obj_name(const Obj* o)
{char* ret = nullptr;
if (o)ret = o->name;
return ret;
}
main.cpp
#include "obj.h"
#include#includeint main()
{Obj *o = nullptr;
o = create_obj(1, "test1");
// printf("id : %d\n", o->id);
printf("id: %d, name: %s\n", get_obj_id(o), get_obj_name(o));
release_obj(o);
printf("id: %d, name: %s\n", get_obj_id(o), get_obj_name(o));
}
參考:
https://www.cnblogs.com/xiaocheng7/p/9420362.html
https://blog.csdn.net/z13653662052/article/details/89003731
https://blog.csdn.net/guogaoan/article/details/38380695
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站題目:C語言實現C++對象和私有成員-創新互聯
當前路徑:http://vcdvsql.cn/article0/hchoo.html
成都網站建設公司_創新互聯,為您提供定制網站、Google、網站收錄、建站公司、靜態網站、用戶體驗
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯