C++ 指针作为类的数据成员

news/2024/7/1 5:18:48

当指针作为类的数据成员时,要想打印当前创建的对象的值有以下两种方法:
1.让指针指向当前所创建的对象
(1)在成员初始化列表进行指针指向

#include<iostream>
using namespace std;
class A
{
public:
	A(const char *str= ""):m_str(str) //指针str接收了helloworld这个字符串的首地址
	{

	}
	void Print()
	{
		cout << m_str << endl;
	}
private:
	char* m_str;
};
void main()
{
	A a("Helloworld");
	a.Print();
}

这样是不可行的,不可以进行编译:
在这里插入图片描述
(2)在构造函数内部进行指针指向

using namespace std;
class A
{
public:
	A(const char *str= "") //指针str接收了helloworld这个字符串的首地址
	{
		m_str = str;
	}
	void Print()
	{
		cout << m_str << endl;
	}
private:
	const char* m_str;  //如果要用m_str指针指向str指针,那么m_str必须也为const类型
};
void main()
{
	A a("Helloworld");
	a.Print();
}

运行结果:
在这里插入图片描述
这样虽然可以输出m_str所指向的对象的值,但是不能修改它的值。当指针作为类的数据成员时,以下方法则可以做到既能输出当前所创建的对象的值,又可以修改它的值。
2.让指针所指向的内存单元中存储所创建的对象的值
输出指针所指向的内存单元中存储所创建的对象的值:

class A
{
public:
	A(const char* str = "")  //指针str接收了helloworld这个字符串的首地址
	{
		m_str = (char*)malloc((strlen(str) + 1) * sizeof(char));
		strcpy_s(m_str, strlen(str) + 1, str);//把str拷贝strlen(str) + 1个给m_str
	}
	void Print()
	{
		cout << m_str << endl;//让m_str这个指针所指向的内存单元中存储helloworld,而不是让m_str指向helloworld
	}
private:
	char* m_str;
};
void main()
{
	A a("Helloworld");
	a.Print();
}

运行结果:
在这里插入图片描述
修改指针所指向的内存单元中存储所创建的对象的值:

class A
{
public:
	A(const char* str = "")  //指针str接收了helloworld这个字符串的首地址
	{
		m_str = (char*)malloc((strlen(str) + 1) * sizeof(char));
		strcpy_s(m_str, strlen(str) + 1, str);//把str拷贝strlen(str) + 1个给m_str
		m_str[3] = '8';
	}
	void Print()
	{
		cout << m_str << endl;//让m_str这个指针所指向的内存单元中存储helloworld,而不是让m_str指向helloworld
	}
private:
	char* m_str;
};
void main()
{
	A a("Helloworld");
	a.Print();
}

运行结果:
在这里插入图片描述
这种方法与第一种方法的区别是:
第一种方法通过指针指向所创建对象的值,从而输出它的值。
第二种方法是通过开辟了一段连续的动态内存单元,将所创建的对象的值存放到这一段内存单元中
【注意】由于malloc所开辟的空间是在堆区,那么就在使用完之后必须要释放掉。
什么时候释放在堆上所开辟的内存空间?
既然在构造函数中开辟了空间,那么就要在析构函数中释放空间。虽然在没有提供析构函数的情况下系统会自动提供一个默认的析构函数,但是由于该段内存空间是在堆上开辟,所以系统提供的析构函数不能满足要求,所以需要程序员把析构函数写出来。
析构函数什么时候必须要程序员定义?
如果有指针作为当前类的数据成员,则一定需要在当前类中自己定义析构函数。
如下:

class A
{
public:
	A(const char* str = "")  //指针str接收了helloworld这个字符串的首地址
	{
		m_str = (char*)malloc((strlen(str) + 1) * sizeof(char));
		strcpy_s(m_str, strlen(str) + 1, str);//把str拷贝strlen(str) + 1个给m_str
		m_str[3] = '8';
	}
	void Print()
	{
		cout << m_str << endl;//让m_str这个指针所指向的内存单元中存储helloworld,而不是让m_str指向helloworld
	}
	~A()
	{
		if (m_str != NULL)
		{
			free(m_str);
			m_str = NULL;
		}		
	}
private:
	char* m_str;
};
void main()
{
	A a("Helloworld");
	a.Print();
}

运行结果:
在这里插入图片描述
这样程序才算是完整了。


http://lihuaxi.xjx100.cn/news/1386469.html

相关文章

高收入人群如何节税?分享三种实用方法!

高收入人群如何节税&#xff1f;分享三种实用方法&#xff01; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 我们国家的贫富差距大&#xff0c;大家的收入水平也是参差不齐的&#xff0c;但是最让人不解的是对于高收入人群来说需要…

Vue cli中模式和环境变量

Vue CLI 项目有三个模式&#xff1a; development模式 开发环境test模式 测试环境production模式 生产环境 可在构建命令中使用开发环境变量&#xff1a;&#xff08;使用其他环境同理&#xff0c;改变development即可&#xff09; vue-cli-service build --mode deve…

【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】

文章目录 ARM64 zero registerARMv8 zero 寄存器的背景xzr 在寄存器读写操作中的使用 上篇文章&#xff1a;ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 下篇文章&#xff1a;ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) ARM64 zero registe…

二叉树的层序遍历(两种方法:迭代+递归)

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 解题思路&#xff1a;迭代法…

小狐狸ChatGPT付费创作系统V2.1.0全开源版(vue全端)

小狐狸GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;无限多…

SAP财务系统中的“增值税”

1. 前言 在前一篇博客《SAP财务系统中的“复式记账法”》中&#xff0c;介绍了复式记账的基本原理&#xff0c;同时给出了在采购和销售流程中常见的记账科目&#xff0c;但也遗留了一些知识点&#xff0c;例如增值税等概念。 在本篇博客中&#xff0c;我们将覆盖这些知识点&a…

Python版day60

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 class Solution:def largestRectangleArea(self, heights: List[int]) -> i…

简单动态库调用CMakeLists配置

1. 动态库生成 fun.h和fun.cpp int my_add(int a, int b); #include "fun.h" int my_add(int a, int b) {return a b; } 动态库生成的CMakeLists.txt cmake_minimum_required(VERSION 3.14) set(CMAKE_DEBUG_POSTFIX "d") project(funso) set(SRC_ f…