01面向类的讲解

news2024/9/29 5:29:36

指针指向类成员使用

代码:

#include<iostream>
using namespace std;

class Test
{
public:
	void func() { cout << "call Test::func" << endl; }
	static void static_func();
	int ma;

	static int mb; //不依赖对象
};
void Test::static_func() { cout << "Test::static_func " << endl; }
int Test::mb;
int main()
{
	Test t1;
	Test* t2 = new Test();
	//int a= 10; int *p =&a; *p = 30;
	//无法从"int Test::* 转换为 int *;
	int Test::* p = &Test::ma;
	//*p = 20;//错误
	t1.*p = 20;
	cout << "t1.ma = " << t1.ma << endl; //通过ma来看
	t2->*p = 30;
	cout << "t2-->ma = " << t2->ma << endl; //通过ma来看

	int* p1 = &Test::mb;
	*p1 = 40;
	cout << Test::mb << endl;

	//指向成员方法的指针
	//无法转换 “初始化”: 无法从“void (__cdecl Test::* )(void)”转换为“void (__cdecl *)(void)” 
	void(Test:: * func)() = &Test::func;
	(t1.*func)();
	(t2->*func)(); //普通成员函数依赖对象

	//定义一个函数指针指向类的静态成员函数
	void(*pfunc)() = &Test::static_func;
	(*pfunc)();
	delete t2;
	return 0;
}

总结:针对类成员普通的指针需要指定对象

2、深浅拷贝

#include<iostream>
#include<string>
using namespace std;

class People
{
public:
	People(const char* _name) : name(new char[strlen(_name) + 1])
	{
		strcpy_s(name, strlen(_name) + 1, _name);
	}

	People(const People& other) :name(new char[strlen(other.name) + 1]) //开辟控件赋值的是深拷贝
	{
		strcpy_s(name, strlen(other.name) + 1, other.name);
	}

	//深拷贝
	People& operator =(const People& other)
	{
		name = new char[strlen(other.name) + 1];
		strcpy_s(name, strlen(other.name) + 1, other.name);
	}
	~People()
	{
		delete[] name;
		cout << "析构函数" << typeid(*this).name() << endl;
	}

	void print()
	{
		cout << name << endl;
	}

private:
	char* name;
};

int main()
{
	People a("shabi");
	People b(a);
	People c = b;
	c.print();
	b.print();
	a.print();
	return 0;
}

效果如下:
在这里插入图片描述

3、构造和析构函数

#include<iostream>
using namespace std;

#include<time.h>
//构造函数和析构函数的讲解
class SeqStack
{
public:
	/*void init(int size = 10)
	{
		_stack = new int[size];
		_top = -1;
		_size = size;
	}*/
	SeqStack(int size = 10) //可以重载,多个参数
	{
		_stack = new int[size];
		_top = -1;
		_size = size;
	}

	/*void release()
	{
		delete[] _stack;
		_stack = nullptr;
	}*/

	~SeqStack()
	{
		delete[] _stack;
		_stack = nullptr;
		cout << "析构函数" << endl;
	
	}

	void push(int val)
	{
		if (full())
		{
			resize();
		}
		_stack[++_top] = val;

	}
	void pop()
	{
		if (empty())
		{
			return;
		}
		--_top;
	}
	int top()
	{
		return _stack[_top];
	}

	bool empty()
	{
		if (_top == -1)return true;
		return false;
	}

	bool full() { return _top == _size - 1; }
private:
	int* _stack;
	int _size;//存储顺序栈的元素
	int _top; //指向栈顶的位置

	void resize()
	{
		int* tmp = new int[_size * 2];
		for (int i = 0; i < _size; i++)
		{
			tmp[i] = _stack[i];
			//memset(tmp,_stack,sizeof(int)*_size);realloc 内存的拷贝
		}
		delete[] _stack;
		_stack = tmp;
		tmp = nullptr;
		_size *= 2;
	}
};

int main()
{
	SeqStack s;

	for (int i = 0; i < 15; i++)
	{
		s.push(rand() % 100);
	}
	while (!s.empty())
	{
		cout << s.top() << " ";
		s.pop();
	}
	//s.release();//释放成员变量占用的外部堆内存
	return 0;
}

效果如下:
在这里插入图片描述

4、构造函数的初始化列表

#include<iostream>
using namespace std;
#include<string>

/*
构造函数的初始化列表

*/

//日期类
class CDate
{
public:
	CDate(int y, int m, int d) :_year(y), _month(m), _day(d) //自定义之后不会再产生默认的构造函数了
	{

	}

	void show()
	{
		cout << "_year " << _year << endl;
		cout << " _month" << _month << endl;
		cout << "_day" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;

};
class CGoods
{
public:
	CGoods(const char* n, int a, double p, int y, int m, int d) :_date(y, m, d) //初始化的列表功能
	{
		strcpy_s(_name, strlen(n) + 1, n);
		_amount = a;
		_price = p;
	}
	void show()
	{
		cout << "name : " << _name << endl;
		cout << "amount: " << _amount << endl;
		cout << "price: " << _price << endl;
	}
	CDate test()
	{
		return _date;
	}
private:

	char _name[20];
	int _amount;
	double _price; //初始化顺序的时候,先name按照先后哈
	/*
	Test(int data = 10):mb(data),ma(mb);
	private:
		int ma;
		int mb;先初始化ma然后是mb
	*/
	CDate _date; //成员对象 没有合适的默认构造函数 说明写了之后,默认的就没了
};

int main()
{
	CGoods c("张三", 12, 12, 1, 1, 1);
	c.show();
	c.test().show();
	return 0;
}


效果展示:
在这里插入图片描述

5、掌握类的各种成员方法以及区别


#include<iostream>
using namespace std;
#include<string>

/*
构造函数的初始化列表

*/

//日期类
class CDate
{
public:
	CDate(int y, int m, int d) :_year(y), _month(m), _day(d) //自定义之后不会再产生默认的构造函数了
	{

	}

	void show()
	{
		cout << "_year " << _year << endl;
		cout << " _month" << _month << endl;
		cout << "_day" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;

};
class CGoods
{
public:
	CGoods(const char* n, int a, double p, int y, int m, int d) :_date(y, m, d) //初始化的列表功能
	{
		strcpy_s(_name, strlen(n) + 1, n);
		_amount = a;
		_price = p;
		goods_numbr++;
	}
	void show() const //常用方法
	{
		cout << "name : " << _name << endl;
		cout << "amount: " << _amount << endl;
		cout << "price: " << _price << endl;
	}
	CDate test()
	{
		return _date;
	}

	int get_number()
	{
		cout << "商品的总数量是: "<<goods_numbr << endl;
		//cout<<name;这种错的,不能访普通成员的变量
		return 1;
	}
private:

	char _name[20];
	int _amount;
	double _price; //初始化顺序的时候,先name按照先后哈
	/*
	Test(int data = 10):mb(data),ma(mb);
	private:
		int ma;
		int mb;先初始化ma然后是mb
	*/
	CDate _date; //成员对象 没有合适的默认构造函数 说明写了之后,默认的就没了

	//记录商品的成员变量数量
	static int goods_numbr; //不属于对象属于类级别
};
int CGoods::goods_numbr = 0;

int main()
{
	CGoods c("商品1", 12, 12, 1, 1, 1);
	CGoods c1("商品2", 12, 12, 1, 1, 1);
	CGoods c2("商品3", 12, 12, 1, 1, 1);
	CGoods c3("商品4", 12, 12, 1, 1, 1);
	c.show();
	c.test().show();
	c.get_number();
	//统计商品的总数量
	return 0;
}


/*
总结:
static静态成员方法
1、属于类的作用域
2、用类名作用域来调用方法
*/

6、类和对象、this指针

C++:OOP对象 OOP编程 this指针
C++:实体的抽象类型
四大特性: 抽象,封装,继承,多态
三种:公有私有以及保护 ,属性一般私有,提供公有的方法访问属性

7、实际运用

#include<iostream>
#include<string>
using namespace std;


//类和对象代码实践应用
class String
{
public:
	String(const char* str = nullptr)
	{
		if (str != nullptr)
		{
			m_data = new char[strlen(str) + 1];

			strcpy_s(this->m_data, strlen(str) + 1, str);
		}
		else
		{
			m_data = nullptr;
		}
	}
	String(const String& other)
	{
		if (this != &other)
		{
			m_data = new char[strlen(other.m_data) + 1];
			strcpy_s(m_data, strlen(other.m_data) + 1, other.m_data);

		}
		else
		{
			m_data = new char[1];
			*m_data = '\0';
		}
		
	}

	~String(void)//析构函数
	{
		delete[]m_data;
	}
	String& operator =(const String& other)
	{
		if (this == &other)
		{
			return *this;
		}
		delete[] m_data;
		m_data = new char[strlen(other.m_data) + 1];
		strcpy_s(m_data, strlen(other.m_data) + 1, other.m_data);
		return *this;
	}
private:
	char* m_data;

};

int main()
{
	String str1;
	String str2("hello");
	String str3(str2);
	String str4 = str3 = str2;//调用赋值重载函数
}
//循环队列 memcpy realloc 不太合适
#include<iostream>
#include<time.h>
using namespace std;

class Queue
{
public:
	Queue(int size = 5)
	{
		_queue = new int[size];
		_front = _rear = 0;
		_size = size;
	}
	//Queue(const Queue&) = delete;
	//Queue& operator=(const Queue&) = delete;
	Queue(const Queue& src)
	{
		_size = src._size;
		_front = src._front;
		_rear = src._rear;
		_queue = new int[_size];
		for (int i = _front; i != _rear; i++)
		{
			_queue[i] = src._queue[i];
		}
	}

	Queue& operator = (const Queue& src)
	{
		if (this == &src)return *this;
		_size = src._size;
		_front = src._front;
		_rear = src._rear;
		_queue = new int[_size];
		for (int i = _front; i != _rear; i++)
		{
			_queue[i] = src._queue[i];
		}
		return *this;
	}
	~Queue()
	{
		delete[] _queue;
		_queue = nullptr;
	}

	void push(int val) //入队操作
	{
		if (full())
		{
			resize();
		}
		_queue[_rear] = val;
		_rear = (_rear + 1) % _size;
	}
	void pop()
	{
		if (empty())
		{
			return;
		}
		_front = (_front + 1) % _size;
	}

	int front()
	{
		return _queue[_front];
	}
	bool full() { return (_rear + 1) % _size == _front; }
	bool empty() { return _front == _rear; }


private:
	int* _queue;
	int _front;
	int _rear;
	int _size;

	void resize()
	{
		int* ptmp = new int[2 * _size];
		int index = 0;
		for (int i = _front; i != _rear; i = (i + 1) % _size)
		{
			ptmp[index++] = _queue[i];
		}
		delete[]_queue;
		_queue = ptmp;
		_front = 0;
		_rear = index;
		_size *= 2;
	}
};

int main()
{
	Queue queue;

	for (int i = 0; i < 20; i++)
	{
		queue.push(rand() % 100);
	}
	Queue queue1 = queue;//删掉了拷贝构造就不行了
	while (!queue1.empty())
	{
		cout << queue1.front() << " ";
		queue1.pop();
	}
}

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

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

相关文章

【强化学习-Mode-Free DRL】深度强化学习如何选择合适的算法?DQN、DDPG、A3C等经典算法Mode-Free DRL算法的四个核心改进方向

【强化学习-DRL】深度强化学习如何选择合适的算法&#xff1f; 引言&#xff1a;本文第一节先对DRL的脉络进行简要介绍&#xff0c;引出Mode-Free DRL。第二节对Mode-Free DRL的两种分类进行简要介绍&#xff0c;并对三种经典的DQL算法给出其交叉分类情况&#xff1b;第三节对…

基于VOLOPV2的自动驾驶环境感知系统

基于VOLOPV2的自动驾驶环境感知系统是一个复杂的系统&#xff0c;它主要负责实时检测并识别周围环境中的各种物体和信息&#xff0c;为自动驾驶车辆提供必要的感知数据。以下是对该系统的一个简要介绍&#xff1a; 环境感知是自动驾驶系统中的一个关键部分&#xff0c;它依赖于…

揭秘全网都在搜索的抖音快速涨10000粉的方法,打造真实粉丝海洋!巨量千川投流

抖音作为当下最热门的社交媒体平台之一&#xff0c;拥有数以亿计的用户。对于许多用户来说&#xff0c;快速涨粉成为了一个追逐的目标。在这篇文章中&#xff0c;我们将揭秘一些全网都在搜索的抖音快速涨粉方法&#xff0c;帮助你打造属于自己的真实粉丝海洋。巨量千川投流&…

将机械手与CodeSys中的运动学模型绑定

文章目录 1.背景介绍2.选定运动学模型3.机械手各尺寸的对应4.总结4.1.选择正确的运动学模型4.2.注意各个关节旋转的正方向。4.3.编码器零点与机械零点的偏移修正。 1.背景介绍 最近搞到了一台工业机械手&#xff0c;虽然这个机械手有自己的控制程序&#xff0c;但是我们还是想…

概述篇——计算机网络学习笔记(基于谢希仁教材与PPT)

教材用的是谢希仁的教材&#xff0c;图片来源于谢希仁老师配套的PPT 计算机网络课程PPT&#xff08;通过这个链接&#xff0c;你可以找到课程配套的ppt&#xff09; 计算机网络的定义及其特点 定义 网络 过去大众熟知的三种网络分别是提供电话、电报及传真等服务的电信网络&am…

中小企业如何通过 Tita 统一员工管理

老实说&#xff0c;我不知道如果没有Tita&#xff0c;我们会做什么&#xff1f;如何收集五个不同人的反馈、经理的反馈、员工对经理的反馈&#xff0c;并将其全部放在一个地方&#xff1f; 在没有上线 Tita 之前&#xff0c;我们不是不做&#xff0c;是因为我们做不到。 — CE…

认识下MapReduce

&#x1f50d; 什么是MapReduce&#xff1f; MapReduce是一种分布式计算模型&#xff0c;最初由Google提出&#xff0c;用于处理大规模数据集的并行计算。它将数据处理任务分解成独立的Map和Reduce两个阶段&#xff0c;以实现分布式计算和并行化处理。Map阶段负责将输入数据映…

《C语言文件处理:从新手到高手的跃迁》

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

C++STL初阶(1):string的使用及初阶原理

此文作为学习stl的笔记&#xff0c;许多普及、概念性的知识点将不再罗列&#xff08;如stl的发展、背景等&#xff09; 便于读者作为复习等方法了解。 0.STL简介&#xff08;笔记向&#xff09; STL不是祖师爷本贾尼实现的&#xff0c;是在惠普实验室中实现的。其作为一个数据结…

lora体验

项目链接 GitHub - cloneofsimo/lora: Using Low-rank adaptation to quickly fine-tune diffusion models. 现在如果想体验stable diffusion的lora功能&#xff0c;有很多种渠道吧&#xff0c;虽然lora是微软开源&#xff0c;但是cloneofsimo提供了适配stable diffusion的lor…

Centos 停服倒计时!你的操作系统何去何从?

在计算机技术的不断演进中&#xff0c;操作系统扮演着至关重要的角色。然而&#xff0c;对于许多企业和个人用户来说&#xff0c;CentOS的突然停服消息带来了一场不小的冲击。作为一款备受欢迎的企业级Linux发行版&#xff0c;CentOS的停服意味着用户需要重新评估自己的操作系统…

Win10 WSL2 Ubuntu 22.04 配置深度学习环境

文章目录 WSL安装Anaconda下载Anaconda安装包安装配置conda命令conda换国内源conda初始化shell环境conda init手动源激活脚本&#xff1a; 安装Windows上的NVIDIA GPU驱动WSL安装CUDA Toolkit安装12.1版本环境配置报错1报错2 内存不足导致安装崩溃问题描述问题分析问题解决 WSL…

VMware虚拟机中ubuntu使用记录(8)—— 如何在Ubuntu18.04中安装运行非ROS版本的ORB_SLAM3跑官方数据集(全程手把手教学安装)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 ORB_SLAM3的介绍一、gitee下载ORB_SLAM3源码1. gitee导入gitHub仓库 二、安装支持C特性依赖三、安装Pangolin1. 安装Pangolin的依赖2. 下载编译 四、安装Eigen31.下…

java-spring 09 下.populateBean (方法成员变量的注入@Autowird,@Resource)

01.在populateBean 方法中的&#xff1a;用于Autowird&#xff0c;Resource注入 // 后处理器已经初始化boolean hasInstAwareBpps hasInstantiationAwareBeanPostProcessors();// 需要依赖检查boolean needsDepCheck (mbd.getDependencyCheck() ! AbstractBeanDefinition.DEP…

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

前言 在之前的文章介绍了定点数为什么需要舍入和几种常见的舍入模式。今天我们再来看看另外一种舍入模式&#xff1a;向最临近值取整nearest。 10进制数的nearest nearest&#xff1a; 向最临近值方向取整。它的舍入方式和四舍五入非常类似&#xff0c;都是舍入到最近的整数…

【电路笔记】-无源高通滤波器

无源高通滤波器 文章目录 无源高通滤波器1、概述2、一阶高通滤波器的频率响应3、高通滤波器示例4、二阶高通滤波器5、RC 差异化因素高通滤波器与低通滤波器电路完全相反,因为这两个组件已互换,滤波器输出信号现在从电阻器两端获取。 1、概述 由于低通滤波器只允许低于其截止…

【论文合集1】- 存内计算加速机器学习

本章节论文合集&#xff0c;存内计算已经成为继冯.诺伊曼传统架构后&#xff0c;对机器学习推理加速的有效解决方案&#xff0c;四篇论文从存内计算用于机器学习&#xff0c;模拟存内计算&#xff0c;对CNN/Transformer架构加速角度阐述存内计算。 【1】WWW: What, When, Where…

C# OpenCvSharp Demo - 棋盘格相机标定

C# OpenCvSharp Demo - 棋盘格相机标定 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Text; using Sys…

2019年计算机真题

2019年计算机真题 离散数学 一、用逻辑符号表达下列语句(论域为包含一切事物的集合) 1&#xff09;过平面上的两个点&#xff0c;有且仅有一条直线通过。 解: (1) P ( x , y ) : x , y \mathrm{P}_{(\mathrm{x}, \mathrm{y})}: \mathrm{x}, \mathrm{y} P(x,y)​:x,y 是平面上的…

线性表

1.1线性表的定义 线性表&#xff1a;零个或多个数据元素的有限序列。 注&#xff1a; &#xff08;1&#xff09;它是一个序列。元素之间是有顺序的&#xff0c;若元素存在多个&#xff0c;则第一个元素无前驱&#xff0c;最后一个元素无后继&#xff0c;其他元素有且只有一个…