最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中隱藏結(jié)構(gòu)體的細(xì)節(jié)

 更新時(shí)間:2017年05月21日 08:53:25   作者:青兒哥哥  
以筆者粗淺的認(rèn)識(shí),有兩種最常用的方法,可以實(shí)現(xiàn)庫(kù)內(nèi)結(jié)構(gòu)體定義的隱藏:接口函數(shù)形參使用結(jié)構(gòu)體指針,接口函數(shù)形參使用句柄。

我們都知道,在C語(yǔ)言中,結(jié)構(gòu)體中的字段都是可以訪問(wèn)的?;蛘哒f(shuō),在C++ 中,類和結(jié)構(gòu)體的主要區(qū)別就是類中成員變量默認(rèn)為private,而結(jié)構(gòu)體中默認(rèn)為public。結(jié)構(gòu)體的這一個(gè)特性,導(dǎo)致結(jié)構(gòu)體中封裝的數(shù)據(jù),實(shí)際上并沒(méi)有封裝,外界都可以訪問(wèn)結(jié)構(gòu)體重的字段。

C++中我們尚可用類來(lái)替代結(jié)構(gòu)體,但是,C語(yǔ)言中是沒(méi)有類的,只能用結(jié)構(gòu)體,但很多時(shí)候,我們需要隱藏結(jié)構(gòu)體的字段,不讓外界直接訪問(wèn),而是通過(guò)我們寫(xiě)的函數(shù)進(jìn)行間接訪問(wèn),這樣就提高了程序的封裝性。

實(shí)現(xiàn)方法,簡(jiǎn)單來(lái)說(shuō),就是,結(jié)構(gòu)體定義時(shí),要定義在.c文件中,然后我們自己定義一些訪問(wèn)結(jié)構(gòu)體的函數(shù),在.h文件中,只存放函數(shù)原型聲明和對(duì)結(jié)構(gòu)體的聲明。

看個(gè)例子

.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文件中,我定義了一個(gè)結(jié)構(gòu)體,并且定義了一些用于操作這個(gè)結(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,并且寫(xiě)了函數(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("設(shè)置的id為:%s\n",id);
  return 0;


  
}

可以看到,在main函數(shù)中,我先是定義了一個(gè)struct stu類型的指針,然后通過(guò)new_stu()給這個(gè)指針?lè)峙淞丝臻g,在通過(guò)另外兩個(gè)函數(shù)對(duì)其進(jìn)行了操作。

這里需要注意一下我注釋掉的部分,說(shuō)明一下:

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

因?yàn)椋?/p>

.h文件中,只是對(duì)結(jié)構(gòu)體進(jìn)行了聲明,并沒(méi)有結(jié)構(gòu)體具體細(xì)節(jié)的描述,也就是在main.c中只是聲明了一下struct stu,這樣編譯器就知道有個(gè)結(jié)構(gòu)體類型叫struct stu,但是它并不知道stu的內(nèi)部細(xì)節(jié)。

我們都知道,定義一個(gè)變量,編譯器是要給它分配內(nèi)存空間的,但是,此時(shí)編譯器并不知道stu的內(nèi)部細(xì)節(jié),也就不知道stu這個(gè)結(jié)構(gòu)體的變量要占多少空間,自然無(wú)法分配內(nèi)存。這樣在編譯時(shí)期就會(huì)報(bào)錯(cuò)。

但是定義一個(gè)指針變量就不一樣啦,不管是什么類型的指針,占據(jù)的內(nèi)存空間都是4個(gè)字節(jié),編譯器只需要確定有個(gè)叫struct stu 的類型存在就好了,而.h中那個(gè)聲明,就是在告訴編譯器,有這么一個(gè)類型。

同時(shí),這種情況下也不能訪問(wèn)結(jié)構(gòu)體的字段,比如,s->score=100;這條語(yǔ)句在編譯時(shí)就會(huì)報(bào)錯(cuò),原因和上面一樣,編譯器并不知道struct stu結(jié)構(gòu)體的內(nèi)部細(xì)節(jié)。

通過(guò)上面的方法,在除了stu.c文件之外的其他文件中,只能通過(guò)stu.c中定義的函數(shù)來(lái)間接操作結(jié)構(gòu)體變量,而不能直接對(duì)結(jié)構(gòu)體變量進(jìn)行操作,包括不能創(chuàng)建一個(gè)結(jié)構(gòu)體變量!

這樣就很好地體現(xiàn)了程序的封裝性,也提高了程序的安全性。但是就需要我們寫(xiě)很多操作函數(shù)啦,包括創(chuàng)建結(jié)構(gòu)體指針變量分配空間的函數(shù)。

我們也可以在.h文件中用typedef聲明一個(gè)結(jié)構(gòu)體的指針類型,如  typedef struct sut * pStu;

這樣在main.c中就可以用pStu聲明結(jié)構(gòu)體指針變量了。

相關(guān)文章

  • C++ 字符串去重排序?qū)嵗a

    C++ 字符串去重排序?qū)嵗a

    這篇文章主要介紹了C++ 字符串去重排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • c++ 虛函數(shù),虛表相關(guān)總結(jié)

    c++ 虛函數(shù),虛表相關(guān)總結(jié)

    這篇文章主要介紹了c++ 虛函數(shù),虛表的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • 基于C語(yǔ)言實(shí)現(xiàn)迷宮游戲的示例代碼

    基于C語(yǔ)言實(shí)現(xiàn)迷宮游戲的示例代碼

    這篇文章主要介紹了基于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的迷宮游戲,對(duì)于學(xué)習(xí)游戲開(kāi)發(fā)的朋友相信有一定的借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言中`||`的短路機(jī)制詳解

    C語(yǔ)言中`||`的短路機(jī)制詳解

    在C語(yǔ)言中,邏輯或運(yùn)算符(||)是一種常用的邏輯運(yùn)算符,用于組合多個(gè)條件表達(dá)式,C語(yǔ)言中的邏輯或運(yùn)算符具有短路機(jī)制,這是一種非常重要的概念,本文將深入解釋C語(yǔ)言中的||短路機(jī)制以及其在編程中的應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • C++運(yùn)算符重載詳情介紹

    C++運(yùn)算符重載詳情介紹

    這篇文章主要介紹了C++運(yùn)算符重載,C++當(dāng)中除了函數(shù)可以重載之外,其實(shí)運(yùn)算符也是可以重載的,C++根據(jù)操作數(shù)的數(shù)目和類型來(lái)決定要使用哪一種操作,下面一起進(jìn)入文章里哦阿姐更多詳情吧
    2022-01-01
  • C++函數(shù)模板的使用詳解

    C++函數(shù)模板的使用詳解

    大家好,本篇文章主要講的是C++函數(shù)模板的使用詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++中explict關(guān)鍵字用法

    C++中explict關(guān)鍵字用法

    這篇文章主要介紹了C++中explict關(guān)鍵字用法的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • C++ 中的INT_MAX,INT_MIN數(shù)值大小操作

    C++ 中的INT_MAX,INT_MIN數(shù)值大小操作

    這篇文章主要介紹了C++ 中的INT_MAX,INT_MIN數(shù)值大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • C/C++實(shí)現(xiàn)MD5校驗(yàn)學(xué)習(xí)

    C/C++實(shí)現(xiàn)MD5校驗(yàn)學(xué)習(xí)

    MD5全程Message-Digest?Algorithm?5,即消息摘要算法第五版,是屬于hash算法的一種,本文主要介紹了如何在C++中實(shí)現(xiàn)MD5校驗(yàn),需要的可以了解下
    2024-03-03
  • 教你在VS2022?MFC程序中調(diào)用CUDA代碼的方法

    教你在VS2022?MFC程序中調(diào)用CUDA代碼的方法

    這篇文章主要介紹了在VS2022?MFC程序中調(diào)用CUDA代碼,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

汪清县| 香格里拉县| 静海县| 耒阳市| 盐城市| 湘潭市| 微山县| 金堂县| 尉氏县| 来凤县| 高青县| 红桥区| 商水县| 宁南县| 阳朔县| 甘洛县| 云南省| 七台河市| 凌源市| 临泉县| 桃园市| 沙湾县| 新宁县| 宁国市| 同心县| 东至县| 贵阳市| 玉树县| 柘荣县| 永仁县| 洪洞县| 即墨市| 民县| 梁河县| 定结县| 保康县| 奉节县| 镇康县| 和平区| 克东县| 曲阳县|