C語言中隱藏結(jié)構(gòu)體的細節(jié)
我們都知道,在C語言中,結(jié)構(gòu)體中的字段都是可以訪問的?;蛘哒f,在C++ 中,類和結(jié)構(gòu)體的主要區(qū)別就是類中成員變量默認為private,而結(jié)構(gòu)體中默認為public。結(jié)構(gòu)體的這一個特性,導致結(jié)構(gòu)體中封裝的數(shù)據(jù),實際上并沒有封裝,外界都可以訪問結(jié)構(gòu)體重的字段。
C++中我們尚可用類來替代結(jié)構(gòu)體,但是,C語言中是沒有類的,只能用結(jié)構(gòu)體,但很多時候,我們需要隱藏結(jié)構(gòu)體的字段,不讓外界直接訪問,而是通過我們寫的函數(shù)進行間接訪問,這樣就提高了程序的封裝性。
實現(xiàn)方法,簡單來說,就是,結(jié)構(gòu)體定義時,要定義在.c文件中,然后我們自己定義一些訪問結(jié)構(gòu)體的函數(shù),在.h文件中,只存放函數(shù)原型聲明和對結(jié)構(gòu)體的聲明。
看個例子
.c文件中
//stu.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu{
char id[10];
int score;
};
struct stu *new_stu()
{
struct stu *s;
s = (struct stu *)malloc(sizeof(struct stu));
return s;
}
void set_id(struct stu *s,char *id)
{
strcpy(s->id,id);
}
char *get_id(struct stu *s)
{
return s->id;
}
可以看到,在.c文件中,我定義了一個結(jié)構(gòu)體,并且定義了一些用于操作這個結(jié)構(gòu)體的函數(shù)。
在.h文件中
stu.h #ifndef STU_H #define STU_H struct stu; extern void set_id(struct stu *s,char *id); extern char *get_id(struct stu *s); extern struct stu *new_stu(); #endif
在.h中我聲明了一下結(jié)構(gòu)體struct stu,并且寫了函數(shù)的原型聲明,供其他文件調(diào)用。
在main.c中我引用了stu.h
下面是main.c
#include <stdio.h>
#include "stu.h"
int main()
{
//struct stu s;
//s.score = 100;
//struct stu s = {{0}};
struct stu *s;
s = new_stu();
set_id(s, "950621");
char *id = NULL;
id = get_id(s);
printf("設置的id為:%s\n",id);
return 0;
}
可以看到,在main函數(shù)中,我先是定義了一個struct stu類型的指針,然后通過new_stu()給這個指針分配了空間,在通過另外兩個函數(shù)對其進行了操作。
這里需要注意一下我注釋掉的部分,說明一下:
這種情況下,不能定義struct stu類型的變量?。?!
因為:
.h文件中,只是對結(jié)構(gòu)體進行了聲明,并沒有結(jié)構(gòu)體具體細節(jié)的描述,也就是在main.c中只是聲明了一下struct stu,這樣編譯器就知道有個結(jié)構(gòu)體類型叫struct stu,但是它并不知道stu的內(nèi)部細節(jié)。
我們都知道,定義一個變量,編譯器是要給它分配內(nèi)存空間的,但是,此時編譯器并不知道stu的內(nèi)部細節(jié),也就不知道stu這個結(jié)構(gòu)體的變量要占多少空間,自然無法分配內(nèi)存。這樣在編譯時期就會報錯。
但是定義一個指針變量就不一樣啦,不管是什么類型的指針,占據(jù)的內(nèi)存空間都是4個字節(jié),編譯器只需要確定有個叫struct stu 的類型存在就好了,而.h中那個聲明,就是在告訴編譯器,有這么一個類型。
同時,這種情況下也不能訪問結(jié)構(gòu)體的字段,比如,s->score=100;這條語句在編譯時就會報錯,原因和上面一樣,編譯器并不知道struct stu結(jié)構(gòu)體的內(nèi)部細節(jié)。
通過上面的方法,在除了stu.c文件之外的其他文件中,只能通過stu.c中定義的函數(shù)來間接操作結(jié)構(gòu)體變量,而不能直接對結(jié)構(gòu)體變量進行操作,包括不能創(chuàng)建一個結(jié)構(gòu)體變量!
這樣就很好地體現(xiàn)了程序的封裝性,也提高了程序的安全性。但是就需要我們寫很多操作函數(shù)啦,包括創(chuàng)建結(jié)構(gòu)體指針變量分配空間的函數(shù)。
我們也可以在.h文件中用typedef聲明一個結(jié)構(gòu)體的指針類型,如 typedef struct sut * pStu;
這樣在main.c中就可以用pStu聲明結(jié)構(gòu)體指針變量了。
上一篇:動態(tài)數(shù)組C++實現(xiàn)方法(分享)
欄 目:C語言
下一篇:C語言數(shù)據(jù)結(jié)構(gòu)二叉樹簡單應用
本文標題:C語言中隱藏結(jié)構(gòu)體的細節(jié)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1554.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?


