C语言实现c++对象和私有成员

news2024/11/15 17:59:23

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

录屏软件哪个好用?10个免费好用的「录屏软件」推荐

想知道如何录制自己的流媒体视频吗&#xff1f;有几个选项可以让您免费录制流媒体视频&#xff1a;桌面屏幕录像机、在线工具、浏览器扩展、iOS 应用程序和 Android 应用程序。 查看下表以获取有关不同直播流媒体录像机的更多信息&#xff1a;它们的主要用途和运行的操作系统。…

基于YOLOV5的火灾检测系统(含模型)+GUI界面

基于YOLOV5的火灾检测系统 本期我们带来的内容是基于YOLOV5的火灾检测系统&#xff0c;火灾检测系统还是比较有实际意义的&#xff0c;也方便大家在背景描述中展开。废话不多说&#xff0c;还是先看效果。 完整代码下载地址:基于YOLOV5的火灾检测系统&#xff08;含模型&…

MySQL高级 SQL优化【limitcountupdate优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;limit优化 1.2&#xff1a;count优化 1.2.1&#xff1a;概述 1.2.2&#xff1a;count用法 1.3&#xff1a;update优化 1&#xff1a;SQL优化 1.1&#xff1a;limit优化 在数据量比较大时&#xff0c;如果进行limit分页查询&a…

拉伯配资|战略新兴产业火了,高增长低估值股曝光

导读&#xff1a;2022年&#xff0c;A股商场值得记录的前史性大事件不断。这一年&#xff0c;A股商场上市公司数量正式打破5000家&#xff0c;战略新兴工业上市公司数量打破2500家&#xff0c;占比初次打破50%大关。这一年&#xff0c;A股商场顶住杂乱的外部环境要素&#xff0…

一文读懂:什么是CRM?企业如何通过CRM盈利?

今天和大家分享一篇干货文章&#xff0c;主要探讨什么是CRM&#xff0c;用大白话解释企业究竟如何通过CRM盈利。文章有点长&#xff0c;但看完&#xff0c;相信你会有所收获。 一、什么是CRM CRM——客户关系管理系统&#xff0c;它不仅是一个系统&#xff0c;一个技术解决方案…

云原生安全系列 4:6个 Kubernetes 安全最佳实践

引言&#xff1a; Kubernetes为我们提供了一套很好的核心软件安全原则&#xff0c;但我们仍然需要理解并实施它们。对于 Kubernetes 集群分布式部署&#xff0c;攻击向量的数量也会增加&#xff0c;了解并尽可能限制这些攻击面的最佳实践非常重要。 即使在使用托管的 Kuberne…

以系统思维推进零信任架构演进

声明 本文是学习零信任数据动态授权桔皮书. 下载地址 http://github5.com/view/55013而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 以工程化思维推进零信任架构演进 前文所述零信任数据动态授权能力&#xff0c;是围绕数据本身的库、表、字段构建安…

光点数据中台能干啥?怎么做?用在哪?_光点科技

如今&#xff0c;数据营销已经成为许多公司数字化转型的必要选择。数据中台的支持是企业中任何高层次的业务应用不可或缺的。数据中心面向的公司业务不再是单一业务线&#xff0c;而是从公司整体角度审视业务全景&#xff0c;寻找可重用的沉淀能力。 今天&#xff0c;让我们来了…

一个 Qml MenuBar 的问题

基本情况 使用 QQuick.Control 中的 MenuBar 实现主菜单栏。菜单栏包括 File、Edit、View、Help 菜单项。点击菜单项&#xff0c;会弹出对应的菜单。 ApplicationWindow {id: windowwidth: 320height: 260visible: truemenuBar: MenuBar {Menu {title: qsTr("&File&…

List集合

首先看这个框架图&#xff1a; List集合代表一个元素有序&#xff0c;可重复的集合&#xff0c;集合中每个元素都有对应的顺序索引。List接口中增加了一些根据索引操作元素的方法&#xff1a; void add(int index,E element ) 在列表的指定位置插入该元素。 boolean addAll(in…

【数据结构】LinkedList模拟实现与简单使用

文章目录模拟实现LinkedListLinkedList的简单使用LinkedList的一些方法LinkedList的遍历简单对比一下LinkedList和ArrayList模拟实现LinkedList 在上一篇的博客中&#xff0c;我们讲解了链表的基础知识&#xff0c;并且模拟实现了一个无头单向不循环链表&#xff0c;链表的基础…

12.动态内存

文章目录动态内存12.1动态内存和智能指针12.1.1shared_ptr类make_shared函数shared_ptr的拷贝和赋值shared_ptr自动销毁所管理的对象shared_ptr还自动释放相关联的内存使用了动态生存期的资源的类12.1.2直接管理内存使用new动态分配和初始化对象动态分配的const对象内存耗尽指针…

Java集合类ArrayList应用 | 如何在字符串s1中删除有在字符串s2出现的字符?

目录 一、题干 二、题解 1. 思路 ArrayList实现 2. 代码 ArrayList实现 StringBuilder实现-1 StringBuilder实现-2 三、总结 一、题干 面试的编程题&#xff1a; s1: "welcome to Zhejiang" s2: "come" 要求输出从字符串s1删除s2中存在的字符之后…

如何更好使用markdown输出pdf

如何更好的使用markdown输出PDF 背景&#xff1a;当前很多人比较常用的 markdown 编辑方式是用vscode编写&#xff0c;再使用 vscode 中 的 MPE 的进行预览。有时候会出现这种情况&#xff1a;想要最终输出PDF给客户&#xff0c;但是通过 vscode 中的markdown 转 PDF插件生成 P…

云计算与云原生

如今是云时代&#xff0c;云计算&#xff0c;大数据&#xff0c;人工智能等新的名词在最近爆火。今天我们来了解一下&#xff0c;云计算与云原生。 在了解云原生之前&#xff0c;我们必须要了解云计算。 云计算 什么是云计算&#xff1f; 在了解云计算之前我们需要先了解一…

嵌入式实时操作系统的设计与开发(三)

基本调度机制 用户在基于RTOS开发应用前&#xff0c;首先要创建线程。 aCoral中&#xff0c;用户创建一个线程时须指定用户希望采用的调度策略&#xff0c;例如&#xff0c;用户想创建一个周期性执行的线程并希望通过周期来触发多线程的调度。 //创建一个周期性的线程 acoral…

视频播放中动画

CSS filter属性CSS的filter属性主要用于设置图像的视觉效果。语法&#xff1a;filter: none|blur()|brightness()|contrast()|drop-shadow()|grayscale()|hue-rotate()|invert()|opacity()|saturate()|sepia()|url();Filter 函数注意&#xff1a; 滤镜通常使用百分比 (如&#…

ArcGIS基础实验操作100例--实验49按分区划分栅格图层

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验49 按分区划分栅格图层 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

Power BI柱形图

在PowerBI中制作常见的柱形图&#xff0c;简单来说&#xff0c;柱形图就是利用水平的柱子表示不同分类数据的大小&#xff0c;与之类似的是条形图&#xff0c;它就是竖的柱形图&#xff0c;或者说把柱形图顺时针转动90度就成了条形图&#xff0c;使用以及作图方式类似&#xff…

媒体查询(@media语法、案例)详解

媒体查询media 语法1. 直接写在 CSS 样式中2. 针对不同的媒体设备&#xff0c;从外部链入不同的 stylesheets&#xff08;外部样式表&#xff09;使用 media 实现网页变色龙media 语法 media 可以直接写在 CSS 样式中&#xff0c;或者可以针对不同的媒体设备&#xff0c;从外部…