C语言实现c++对象和私有成员
C语言实现c++对象
类是C++中面向对象编程思想中比较重要的组成部分,与结构体一样类只是一个模板只有在创建对象时才会申请内存空间,类其实是把具有共同特性的数据或方法(面向对象编程中,一般把函数称为方法)都放在一起,用于创建对象时使用
#include <stdio.h>
#include <malloc.h>
typedef 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 <string.h>
#include <stdlib.h>
struct 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 <stdlib.h>
#include <stdio.h>
int 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