扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
类是C++中面向对象编程思想中比较重要的组成部分,与结构体一样类只是一个模板只有在创建对象时才会申请内存空间,类其实是把具有共同特性的数据或方法(面向对象编程中,一般把函数称为方法)都放在一起,用于创建对象时使用
创新互联公司从2013年创立,是专业互联网技术服务公司,拥有项目成都网站建设、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元新洲做网站,已为上家服务,为新洲各地企业和个人服务,联系电话:18982081108#include#includetypedef 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#includestruct 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#includeint 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
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流