当前位置: 首页 > news >正文

C++对象数组对象指针对象指针数组

一、对象数组

对象数组中的每一个元素都是同类的对象;

例1 对象数组成员的初始化
#include<iostream>
using namespace std;class Student
{
public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;cout<<"+++++++++++++++++"<<endl;}
private:int num;string name;char sex;
};int main()
{Student Stud1;Stud1.display();//Stud1未初始化,打印的数据成员为内存脏数据Student Stud2(2078, "wang", 'm');Stud2.display();Student Stud3[20];Stud3[0].display();//Stud3[0]未初始化,打印的数据成员为内存脏数据Student Stud4[3]=            //对象数组的初始化{Student(1001,"He",'m'),    //对象数组成员的初始化Student(1002,"You",'f'),   //对象数组成员的初始化Student(1003,"She",'f')    //对象数组成员的初始化};Stud4[0].display();Stud4[1].display();Stud4[2].display();return 0;
}

例2 对象数组应用
#include<iostream>
using namespace std;class Box
{
public:Box(int h=10,int w=12,int len=15):height(h),width(w),length(len) {};//构造函数初始化int volume( );
private:int height;int width;int length;
};int Box::volume( )
{
return(height*width*length);
}int main( )
{Box a[3]={Box(),         //10*12*15 = 1800Box(15,18),    //15*18*15 = 4050Box(16,20,26)  //16*20*26 = 8320};cout<<"volume of a[0] is "<<a[0].volume( )<<endl;cout<<"volume of a[1] is "<<a[1].volume( )<<endl;cout<<"volume of a[2] is "<<a[2].volume( )<<endl;return 0;
}

二、对象指针

(一)指向对象的指针

在建立对象时,编译系统会为每一个对象分配一定的存储空间,以存放其成员。

可以定义一个指针变量,用来存放对象的指针

class Time{……};
Time time1;Time *pt; //格式  类名 *对象指针
pt = &time1; //格式  pt就是指向Time类对象的指针变量

并且可以通过对象指针访问对象和对象的成员。

*pt
(*pt).hour或pt->hour //即t1.hour
(*pt).showtime()或pt->showtime() //即time1.showtime( )

(二)指向对象数据成员的指针

对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。

定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。

通过指向对象数据成员的指针变量访问成员

注:对象数据成员为私有时,则无法通过指针访问

int *p1;      //一般形式:数据类型名 *指针变量名;
p1=&time1.hour;cout<<*p1<<endl;

(三)指向对象成员函数的指针

指向一般函数的函数指针,如下:

int (*pf)();
p1=fun;
cout<<(*pf)();

1 “定义”指向类成员函数的指针变量

函数返回类型名 (类名∷*函数指针变量名)(参数表列);

void (Time∷*pf)( );

2 “指向”一个成员函数的方法

函数指针变量名 = &类名∷成员函数名;【注意:这里用类名,而非函数名】

pf = &Time∷showtime;

3 通过指向对象中成员函数的指针,调用员函数

(对象名.*函数指针变量名)();

(time.*pf)();
例3 对象指针&对象数据成员指针&对象成员函数指针综合实例
#include <iostream>
using namespace std;class Time
{
public:Time(int,int,int);void get_time( );void showtime();
//private:
public:                 //若为private,则不可通过指针访问(对象指针,对象数据指针均不可访问private)int hour,minute,sec;
};
Time::Time(int h,int m,int s):hour(h),minute(m),sec(s){};void Time::showtime()
{cout<<"hour:"<<hour<<" minute:"<<minute<< " second:"<<sec<<endl;  cout<<"++++++++++++"<<endl;
}void Time::get_time( )
{cout<<hour<<":"<<minute<<":" <<sec<<endl;
}
int main( )
{Time time1(10,11,12);Time *pt1;            //对象指针pt1 = &time1;pt1->showtime();pt1->hour = 9;pt1->minute = 10;(*pt1).sec = 11;(*pt1).showtime();int *p1,*p2,*p3;      //指向对象数据成员的指针p1 = &time1.hour;p2 = &time1.minute;p3 = &time1.sec;*p1 = 8;*p2 = 9;*p3 = 10;time1.showtime();Time time2(7,8,9);void(Time::*pf)();    //指向对象成员函数的指针pf = &Time::showtime; //注意,这里是类名,而非对象名 &time1.showtime(time2.*pf)();return 0;
}

三、对象数组vs对象指针数组

为提高内存的利用率,内存需要被动态的建立和释放

new运算符:动态分配内存;

delete运算符:释放内存。

用new运算符动态地分配内存后,将返回一个指向新对象的指针的值(内存地址,大小4字节),用户通过这个地址来访问对象。

注:

1)通过new建立的对象,由于未定义对象名,只能通过指针来访问;
2)建立对象时会自动执行构造函数;
3)系统内存不足,会出现异常。

Time *pt1=new Time;Time *pt2;
pt2=new Time(8,29,59);
pt2->show_time();

不再需要由new建立的对象时,用delete运算符释放

delete pt1;

注:在释放内存空间之前,自动调用析构函数,完成有关善后清理工作。

例4  对象的申请和释放

#include<iostream>
using namespace std;
class Box
{
public:Box(int w,int l,int h);~Box();int width;int length;int height;
};Box::Box(int w,int l,int h)
{width=w;length=l;height=h;cout<<"========调用构造函数=======\n";
}
Box::~Box()
{cout<<"========调用析构函数=======\n";
}int main()
{Box * pt = new Box(12,13,14);cout<<pt->width<<"\n";cout<<pt->length<<"\n";cout<<pt->height<<endl;delete pt;                //如果不delete pt,则不会执行析构函数return 0;
}

(一)使用new建立动态对象数组成员

int n;
Time *pt;
cin>>n;
pt = new Time[n];
……
delete []pt;

(二)对象指针数组

一个指针只占用4个字节,因此相比于建立数组或对象数组,指针数组的方式更节省空间;

建立占用空间小的指针数组,灵活处理占用空间大的对象集合。

const int N = 100;
Time *pt[N]={NULL};
int i;
……
i=3;
if(pt[i]==NULL)
pt[i] = new Time(10, 10,10);
……
if(pt[i]!=NULL)
delete pt[i];

相关文章:

C++对象数组对象指针对象指针数组

一、对象数组 对象数组中的每一个元素都是同类的对象&#xff1b; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…...

D96【python 接口自动化学习】- pytest进阶之fixture用法

day96 pytest的fixture详解&#xff08;三&#xff09; 学习日期&#xff1a;20241211 学习目标&#xff1a;pytest基础用法 -- pytest的fixture详解&#xff08;三&#xff09; 学习笔记&#xff1a; fixture(scop"class") (scop"class") 每一个类调…...

【算法】动态规划中01背包问题解析

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

选择WordPress和Shopify:搭建对谷歌SEO友好的网站

在建设网站时&#xff0c;不仅要考虑它的美观和功能性&#xff0c;还要关注它是否对谷歌SEO友好。如果你希望网站能够获得更好的搜索排名&#xff0c;WordPress和Shopify是两个值得推荐的建站平台。 WordPress作为最流行的内容管理系统&#xff0c;其强大的灵活性和丰富的插件…...

代理IP与生成式AI:携手共创未来

目录 代理IP&#xff1a;网络世界的“隐形斗篷” 1. 隐藏真实IP&#xff0c;保护隐私 2. 突破网络限制&#xff0c;访问更多资源 生成式AI&#xff1a;创意与效率的“超级大脑” 1. 提高创作效率 2. 个性化定制 代理IP与生成式AI的协同作用 1. 网络安全 2. 内容创作与…...

iOS 应用的生命周期

Managing your app’s life cycle | Apple Developer Documentation Performance and metrics | Apple Developer Documentation iOS 应用的生命周期状态是理解应用如何在不同状态下运行和管理资源的基础。在 iOS 开发中&#xff0c;应用生命周期管理的是应用从启动到终止的整…...

Elasticsearch 集群快照的定期备份设置指南

Elasticsearch 集群快照的定期备份设置指南 概述 快照&#xff1a; 在给定时刻对整个集群或者单个索引进行备份&#xff0c;以便在之后出现故障时可以基于之前备份的快照进行快速恢复。 前提条件&#xff1a; 准备一个备份存储盘&#xff0c;本指南采用的是AWS EFS文件系统做…...

Docker--Docker Image(镜像)

什么是Docker Image&#xff1f; Docker镜像&#xff08;Docker Image&#xff09;是Docker容器技术的核心组件之一&#xff0c;它包含了运行应用程序所需的所有依赖、库、代码、运行时环境以及配置文件等。 简单来说&#xff0c;Docker镜像是一个轻量级、可执行的软件包&…...

C++ 中的序列化和反序列化

一、C 中的序列化和反序列化 &#xff08;一&#xff09;基本概念 在 C 中&#xff0c;序列化是将对象转换为字节流的过程&#xff0c;反序列化则是从字节流重新构建对象的过程。这对于存储对象状态到文件、网络传输等场景非常有用。 &#xff08;二&#xff09;简单的序列化…...

我的Github学生认证申请过程

先说结论&#xff1a;很简单。 学生认证链接&#xff1a;GitHub Education GitHub 1. 首先你得绑定edu邮箱。这个应该没什么问题&#xff0c;Github也会提示。 2. 我是在学校里面、使用流量而非WiFi申请的&#xff0c;听说地理位置很重要&#xff0c;该给的权限&#xff08…...

信奥题解:勾股数计算中的浮点数精度问题

来源:GESP C++ 二级模拟题 本文给出官方参考答案的详细解析,包括每一部分的功能和关键点,以及与浮点数精度相关的问题的分析。 题目描述 勾股数是很有趣的数学概念。如果三个正整数a 、b 、c ,满足 a 2 + b 2 = c 2 a^2 + b^2 = c^2 a2+b2=c2 ,而且1 ≤ a ≤ b ≤ c ,…...

重生之我在学Vue--第2天 Vue 3 Composition API 与响应式系统

重生之我在学Vue–第2天 Vue 3 Composition API 与响应式系统 文章目录 重生之我在学Vue--第2天 Vue 3 Composition API 与响应式系统前言一、Composition API 核心概念1.1 什么是 Composition API&#xff1f;1.2 Composition API 的核心工具1.3 基础用法示例 二、响应式系统2…...

【AI知识】逻辑回归介绍+ 做二分类任务的实例(代码可视化)

1. 分类的基本概念 在机器学习的有监督学习中&#xff0c;分类一种常见任务&#xff0c;它的目标是将输入数据分类到预定的类别中。具体来说&#xff1a; 分类任务的常见应用&#xff1a; 垃圾邮件分类&#xff1a;判断一封电子邮件是否是垃圾邮件 。 医学诊断&#xff1a;…...

Mysql 笔记2 emp dept HRs

-- 注意事项 -- 1.给数据库和表起名字时尽量选择全小写 -- 2.作为筛选条件的字符串是否区分大小写看设置的校对规则utf8_bin 区分 drop database if exists hrs; create database hrs default charset utf8 collate utf8_general_ci;use hrs; drop table if exists tb_emp; dro…...

MySQL和Oracle的区别

MySQL和Oracle的区别 MySQL是轻量型数据库&#xff0c;并且免费&#xff0c;没有服务恢复数据。 Oracle是重量型数据库&#xff0c;收费&#xff0c;Oracle公司对Oracle数据库有任何服务。 1.对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0…...

实验12 C语言连接和操作MySQL数据库

一、安装MySQL 1、使用包管理器安装MySQL sudo apt update sudo apt install mysql-server2、启动MySQL服务&#xff1a; sudo systemctl start mysql3、检查MySQL服务状态&#xff1a; sudo systemctl status mysql二、安装MySQL开发库 sudo apt-get install libmysqlcli…...

09篇--图片的水印添加(掩膜的运用)

如何添加水印&#xff1f; 添加水印其实可以理解为将一张图片中的某个物体或者图案提取出来&#xff0c;然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图&#xff0c;并进行二值化处理&#xff0c;去除背景部分&#xff0c;得到一个类似掩膜的图像。然后…...

sql-labs(21-25)

第21关 第一步 可以发现cookie是经过64位加密的 我们试试在这里注入 选择给他编码 发现可以成功注入 爆出表名 爆出字段 爆出数据 第22关 跟二十一关一模一样 闭合换成" 第 23 关 第二十三关重新回到get请求&#xff0c;会发现输入单引号报错&#xff0c;但是注释符…...

CTF知识集-命令执行

CTF知识集-命令执行 写在开头可能会用到的提醒 ;可以用%0a来替换 是shell_exec的缩写 ls | tee 1 把ls的输出内容存入1这个文件 shell查看文件的几种方式&#xff0c;tac | more | less | tail | sort | tac | cat | head | od | expand 针对flag 可以用grep { flag.php来…...

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志T527开发板&#xff09;的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

今日行情明日机会——20250609

上证指数放量上涨&#xff0c;接近3400点&#xff0c;个股涨多跌少。 深证放量上涨&#xff0c;但有个小上影线&#xff0c;相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析&#xff08;基于最新图片数据&#xff09; 1. 医药&#xff08;11家涨停&#xff09; 代表标…...

Android多媒体——音/视频数据播放(十八)

在媒体数据完成解码并准备好之后,播放流程便进入了最终的呈现阶段。为了确保音视频内容能够顺利输出,系统需要首先对相应的播放设备进行初始化。只有在设备初始化成功后,才能真正开始音视频的同步渲染与播放。这一过程不仅影响播放的启动速度,也直接关系到播放的稳定性和用…...