01面向类的讲解

指针指向类成员使用

代码:

#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://xiahunao.cn/news/3031613.html

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

相关文章

探索GitHub上的GPTs项目:泄露和被破解的GPT提示

GPTs项目是一个在GitHub上由用户linexjlin发起的开源项目&#xff0c;专注于提供泄露的GPT&#xff08;生成式预训练转换器&#xff09;提示。这些提示用于指导和优化AI模型的输出&#xff0c;进而提升代码生成的质量和效率。项目页面提供了丰富的功能和资源&#xff0c;旨在帮…

全套停车场管理系统报价多少钱?停车场管理系统由哪些设备组成?

随着城市化进程的加快&#xff0c;汽车保有量的不断攀升&#xff0c;停车场的管理和运营成为城市基础设施建设的重要组成部分。一个高效、智能的停车场收费系统不仅能提升停车效率&#xff0c;还能增强用户体验&#xff0c;对城市的交通管理起到关键作用。本文将为您详细介绍全…

mac 讨厌百度网盘怎么办

一、别拦我 首先请允许我泄个愤&#xff0c;tmd百度网盘下个1g的文件下载速度竟然超不过200k&#xff0c;只要不放在所有已打开软件的最前面&#xff0c;它就给你降到10k以内&#xff0c;关键是你慢就慢了&#xff0c;我也不是很着急&#xff0c;关键是你日常下载失败并且总是…

AI代理和AgentOps生态系统的剖析

1、AI代理的构成&#xff1a;AI代理能够根据用户的一般性指令自行做出决策和采取行动。 主要包含四个部分&#xff1a; &#xff08;1&#xff09;大模型&#xff08;LLM&#xff09; &#xff08;2&#xff09;工具&#xff1a;如网络搜索、代码执行等 &#xff08;3&#x…

在Qt工具栏上实现矩阵并排的按钮效果源码

如果这个要用MFC去实现头皮都得掉一层&#xff0c;建议大家以后要写GUI方面的小工具尽量转QT或其他吧&#xff0c;MFC真不适合搞这种花里胡哨的界面. 在Qt工具栏上实现矩阵并排的按钮效果源码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwind…

初识指针(4)<C语言>

前言 前面的文章&#xff0c;已经对指针的基础概念以及运用有了初步了解&#xff0c;我们可以进一步探究指针比较深入的知识&#xff0c;下文将主要介绍&#xff1a;使用指针数组模拟二维数组、字符指针变量、数组指针、二维数组传参的本质、函数指针、typedef关键字等。 目录…

RustDesk 自建服务器部署和使用教程

RustDesk 是一个强大的开源远程桌面软件&#xff0c;是中国开发者的作品&#xff0c;它使用 Rust 编程语言构建&#xff0c;提供安全、高效、跨平台的远程访问体验。可以说是目前全球最火的开源远程桌面软件了&#xff0c;GitHub 星星数量达到了惊人的 64k&#xff01; 与 Team…

洪水仿真模拟(ArcGIS),水利数字孪生新利器

这两天ArcGIS Pro的官方账号释放了一个名为“Flood Simulation in ArcGIS Pro”的洪水模拟功能视频。根据视频详情页的介绍&#xff0c;该洪水仿真模拟功能会作为新功能出现在ArcGIS Pro 3.3中。 由于我目前从事的主要应用方向都是弱GIS的领域&#xff0c;所以我已经很久没有再…

图片逐层矢量化

摘要 图像光栅化是计算机图形学中一个成熟的技术&#xff0c;而图像向量化&#xff0c;即光栅化的逆过程&#xff0c;仍然是一个主要的挑战。最近&#xff0c;基于深度学习的先进模型实现了向量化和向量图的语义插值&#xff0c;并展示了生成新图形的更好拓扑结构。然而&#…

MYSQL中的DQL

语法&#xff1a; select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段 limit 分页参数 条件查询 语法&#xff1a; 查询多个字段&#xff1a;select 字段1&#xff0c;字段2 from表名 查询所有字段&#xff1a…

GitHub搭建免费博客

一、GitHub仓库准备 ​ 搭建博客需要准备两个仓库。一个存放博客图床的仓库&#xff0c;另一个存放博客网站的仓库。 1.1、图床创建 新建仓库 第一步&#xff1a; ​ 第二步&#xff1a; 生成Token令牌 点击右上角头像->Settings->下拉&#xff0c;直到左侧到底&#…

使用IDA自带python patch的一道例题

首先看见就是迷宫 迷宫解出的路径&#xff0c;放在zip的文件可以得到一个硬编码 然后在原程序中&#xff0c;有一处很离谱 这个debugbreak就是IDA分析错误导致的 我们点进去发现里面全是nop 然后我们把我们得到的硬编码放在010里面&#xff0c;再用IDA打开 重新编译看汇编 你…

ACC-UNet: A Completely Convolutional UNet Model for the 2020s

文章目录 ACC-UNet: A Completely Convolutional UNet Model for the 2020s摘要方法实验结果 ACC-UNet: A Completely Convolutional UNet Model for the 2020s 摘要 这十年以来&#xff0c;计算机视觉领域引入了 Vision Transformer&#xff0c;标志着广泛的计算机视觉发生了…

QT学习之合成图片

1.给bmp图片添加文字 // 2.合成前后图片 QImage imageF("bkF.bmp"); // 加载图片 QPainter painter(&imageF); painter.setFont(QFont("Arial", 5)); // 设置文字的字体和大小 // 设置姓名 QPoint posName(95, 68); painter.drawText(posName, rea…

2010-2022年ESA_ CCI-LC数据集下载

扫描文末二维码&#xff0c;关注微信公众号&#xff1a;ThsPool 后台回复 g009&#xff0c;领取 2010-2022年300m分辨率 ESA_ CCI-LC 数据集 哥白尼气候数据集&#xff1a;土地利用和土地覆盖研究的宝贵资源 &#x1f30d;&#x1f50d; 土地利用和土地覆盖变化是全球变化研究…

武汉星起航引领跨境新浪潮,一站式解决方案助力卖家驰骋亚马逊

在全球化浪潮下&#xff0c;跨境电商已成为外贸发展的新引擎&#xff0c;为无数创业者提供了全新的商业机遇。而在这场跨境电商的浪潮中&#xff0c;武汉星起航电子商务有限公司以其专业的一站式解决方案&#xff0c;成为众多创业者和卖家的得力助手&#xff0c;引领着他们成功…

GT2512-STBA 三菱触摸屏12.1寸型

T2512-STBA参数说明&#xff1a;12.1"、SVGA 800*600、65536色、TFT彩色液晶显示屏、AC电源、32MB内存 三菱触摸屏GT2512-STBA性能规格详细说明&#xff1a; [显示部] 显示软元件&#xff1a;TFT彩色液晶显示屏 画面尺寸&#xff1a;12.1寸 分辨率&#xff1a;SVGA 80…

通用人工智能AGI,究竟是一个哲学问题还是技术问题?

引言 在探索人工智能的未来方向中&#xff0c;人工通用智能&#xff08;AGI&#xff09;的概念逐渐成为科技领域和哲学探讨的焦点。AGI旨在创建可以执行任何智能任务的机器&#xff0c;甚至在某些方面超越人类的能力。然而&#xff0c;关于AGI的研究不仅仅是技术问题&#xff…

idea上如何新建git分支

当前项目在dev分支&#xff0c;如果想在新分支上开发代码&#xff0c;如何新建一个分支呢&#xff1f;5秒搞定~ 1、工具类选择git&#xff0c;点击New Branch 或者右下角点击git分支&#xff0c;再点击New Branch 2、在弹出的Create New Branch弹窗中&#xff0c;输入你的新分支…