C語言中,隱藏結構體的細節

來源:互聯網
上載者:User

標籤:操作   報錯   原型   結構體類型   fine   包括   ext   log   har   

我們都知道,在C語言中,結構體中的欄位都是可以訪問的。或者說,在C++ 中,類和結構體的主要區別就是類中成員變數預設為private,而結構體中預設為public。結構體的這一個特性,導致結構體中封裝的資料,實際上並沒有封裝,外界都可以訪問結構體重的欄位。

C++中我們尚可用類來替代結構體,但是,C語言中是沒有類的,只能用結構體,但很多時候,我們需要隱藏結構體的欄位,不讓外界直接存取,而是通過我們寫的函數進行間接訪問,這樣就提高了程式的封裝性。

 

實現方法,簡單來說,就是,結構體定義時,要定義在.c檔案中,然後我們自己定義一些訪問結構體的函數,在.h檔案中,只存放函數原型聲明和對結構體的聲明。

看個例子

.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檔案中,我定義了一個結構體,並且定義了一些用於操作這個結構體的函數。

在.h檔案中

stu.h
#ifndef STU_H#define STU_Hstruct stu;extern void set_id(struct stu *s,char *id);extern char *get_id(struct stu *s);extern struct stu *new_stu();#endif

在.h中我聲明了一下結構體struct stu,並且寫了函數的原型聲明,供其他檔案調用。

在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函數中,我先是定義了一個struct stu類型的指標,然後通過new_stu()給這個指標分配了空間,在通過另外兩個函數對其進行了操作。

 

這裡需要注意一下我注釋掉的部分,說明一下:

這種情況下,不能定義struct stu類型的變數!!!

因為:

.h檔案中,只是對結構體進行了聲明,並沒有結構體具體細節的描述,也就是在main.c中只是聲明了一下struct stu,這樣編譯器就知道有個結構體類型叫struct stu,但是它並不知道stu的內部細節。

我們都知道,定義一個變數,編譯器是要給它分配記憶體空間的,但是,此時編譯器並不知道stu的內部細節,也就不知道stu這個結構體的變數要佔多少空間,自然無法分配記憶體。這樣在編譯時間期就會報錯。

但是定義一個指標變數就不一樣啦,不管是什麼類型的指標,佔據的記憶體空間都是4個位元組,編譯器只需要確定有個叫struct stu 的類型存在就好了,而.h中那個聲明,就是在告訴編譯器,有這麼一個類型。

 

同時,這種情況下也不能訪問結構體的欄位,比如,s->score=100;這條語句在編譯時間就會報錯,原因和上面一樣,編譯器並不知道struct stu結構體的內部細節。

 

通過上面的方法,在除了stu.c檔案之外的其他檔案中,只能通過stu.c中定義的函數來間接操作結構體變數,而不能直接對結構體變數進行操作,包括不能建立一個結構體變數!

這樣就很好地體現了程式的封裝性,也提高了程式的安全性。但是就需要我們寫很多操作函數啦,包括建立結構體指標變數分配空間的函數。

 

我們也可以在.h檔案中用typedef聲明一個結構體的指標類型,如  typedef struct sut * pStu;

這樣在main.c中就可以用pStu聲明結構體指標變數了。

 

C語言中,隱藏結構體的細節

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.