c语⾔隐藏结构体,C语⾔中隐藏结构体的细节
我们都知道,在C语⾔中,结构体中的字段都是可以访问的。或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,⽽结构体中默认为public。结构体的这⼀个特性,导致结构体中封装的数据,实际上并没有封装,外界都可以访问结构体重的字段。
C++中我们尚可⽤类来替代结构体,但是,C语⾔中是没有类的,只能⽤结构体,但很多时候,我们需要隐藏结构体的字段,不让外界直接访问,⽽是通过我们写的函数进⾏间接访问,这样就提⾼了程序的封装性。
实现⽅法,简单来说,就是,结构体定义时,要定义在.c⽂件中,然后我们⾃⼰定义⼀些访问结构体的函数,在.h⽂件中,只存放函数原型声明和对结构体的声明。
看个例⼦
.c⽂件中
//stu.c
#include
#include
#include
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_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中我声明了⼀下结构体struct stu,并且写了函数的原型声明,供其他⽂件调⽤。
在main.c中我引⽤了stu.h
下⾯是main.c
#include
#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的内部
c语言中struct细节,也就不知道stu这个结构体的变量要占多少空间,⾃然⽆法分配内存。这样在编译时期就会报错。
但是定义⼀个指针变量就不⼀样啦,不管是什么类型的指针,占据的内存空间都是4个字节,编译器只需要确定有个叫struct stu 的类型存在就好了,⽽.h中那个声明,就是在告诉编译器,有这么⼀个类型。
同时,这种情况下也不能访问结构体的字段,⽐如,s->score=100;这条语句在编译时就会报错,原因和上⾯⼀样,编译器并不知道struct stu结构体的内部细节。
通过上⾯的⽅法,在除了stu.c⽂件之外的其他⽂件中,只能通过stu.c中定义的函数来间接操作结构体变量,⽽不能直接对结构体变量进⾏操作,包括不能创建⼀个结构体变量!
这样就很好地体现了程序的封装性,也提⾼了程序的安全性。但是就需要我们写很多操作函数啦,包括创建结构体指针变量分配空间的函数。
我们也可以在.h⽂件中⽤typedef声明⼀个结构体的指针类型,如 typedef struct sut * pStu;
这样在main.c中就可以⽤pStu声明结构体指针变量了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论