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

类和动态内存分配(使用指向对象的指针)

使用指向对象的指针

C++程序经常使用指向对象的指针,因此,这里来练习一下。程序清单12.6 使用数组索引值来跟踪最
短的字符串和按字母顺序排在最前面的字符串。另一种方法是使用指针指向这些类别的开始位置,程序清
单12.7 使用两个指向String 的指针实现了这种方法。最初,shortest 指针指向数组中的第一个对象。每当
程序找到比指向的字符串更短的对象时,就把shortest 重新设置为指向该对象。同样,first 指针跟踪按字母
顺序排在最前面的字符串。这两个指针并不创建新的对象,而只是指向已有的对象。因此,这些指针并不
要求使用new 来分配内存。

除此之外,程序清单12.7 中的程序还使用一个指针来跟踪新对象:

String * favorite=new String(sayings[choice]);

这里指针favorite 指向new 创建的未被命名对象。这种特殊的语法意味着使用对象saying [choice]来初
始化新的String 对象,这将调用复制构造函数,因为复制构造函数(const String &)的参数类型与初始化
值(saying [choice])匹配。程序使用srand( )、rand( )和time( )随机选择一个值。

#include <iostream> #include<cstdlib> #include<ctime> #include"string1.h" const int ArSize = 10; const int MaxLen = 81; int main() { using namespace std; String name; cout << "Hi,what's your name?\n"; cin >> name; cout << name << ",please enter up to " << ArSize << "short sayings<empty line to quit>:\n"; String sayings[ArSize]; char temp[MaxLen]; int i; for (i = 0; i < ArSize; i++) { cout << i + 1 << ":"; cin.get(temp, MaxLen); while (cin && cin.get() != '\n') continue; if (!cin || temp[0] == '\0') break; else sayings[i] = temp; } int total = i; if (total = i) { cout << "Here are your sayings:\n"; for (i = 0; i < total; i++) cout << sayings[i] << "\n"; String* shortest = &sayings[0]; String* first = &sayings[0]; for (i = 1; i < total; i++) { if (sayings[i].length() < shortest->length()) shortest = &sayings[i]; if (sayings[i] < *first) first = &sayings; } cout << "Shortest saying:\n" << *shortest << endl; cout << "First alphabetically:\n" << *first << endl; srand(time(0)); int choice = rand() % total; String* favorite = new String(sayings[choice]); cout << "My favorite saying : \n" << *favorite << endl; delete favorite; } else cout << "Not much to say,eh?\n"; cout << "Bye.\n"; return 0; }

程序清单12.4、程序清单12.5 和程序清单12.7 组成的程序在两个层次上使用了new 和delete。首先,
它使用new 为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的,因此析构函数
使用delete 来释放这些内存。因为字符串是一个字符数组,所以析构函数使用的是带中括号的delete。
这样,当对象被释放时,用于存储字符串内容的内存将被自动释放。其次,程序清单12.7 中的代码使用
new 来为整个对象分配内存:

String * favorite=new String(sayings[choice]);

这不是为要存储的字符串分配内存,而是为对象分配内存;也就是说,为保存字符串地址的str 指针和
len 成员分配内存(程序并没有给num_string 成员分配内存,这是因为num_string 成员是静态成员,它独立于对象被保存)。创建对象将调用构造函数,后者分配用于保存字符串的内存,并将字符串的地址赋给
str。然后,当程序不再需要该对象时,使用delete 删除它。对象是单个的,因此,程序使用不带中括号的
delete。与前面介绍的相同,这将只释放用于保存str 指针和len 成员的空间,并不释放str 指向的内存,而
该任务将由析构函数来完成(参见图12.4)。

在下述情况下析构函数将被调用(参见图12.4)。

  • 如果对象是动态变量,则当执行完定义该对象的程序块时,将调用该对象的析构函数。因此,在
    程序清单12.3 中,执行完main()时,将调用headline[0]和headline[1]的析构函数;执行完callme1( )
    时,将调用grub 的析构函数。
  • 如果对象是静态变量(外部、静态、静态外部或来自名称空间),则在程序结束时将调用对象的析
    构函数。这就是程序清单12.3 中sports 对象所发生的情况。
  • 如果对象是用new 创建的,则仅当您显式使用delete 删除对象时,其析构函数才会被调用。

指针和对象小结

使用对象指针时,需要注意几点(参见图12.5):

  • 使用常规表示法来声明指向对象的指针:
String *glamour;
  • 可以将指针初始化为指向已有的对象:
String * first=&saying[0];

可以使用new 来初始化指针,这将创建一个新的对象(有关使用new 初始化指针的细节,请参见
图12.6):

String *favorite=new String(sayings[choice);
  • 对类使用new 将调用相应的类构造函数来初始化新创建的对象:
String * gleep=new String; String * glop=new String("my my my"); String * favorite=new String(sayings[choice]);

  • 可以使用->运算符通过指针访问类方法:
if(saying[i].length()<shortest->length())
  • 可以对对象指针应用解除引用运算符(*)来获得对象:
if(sayings[i]<*first) first=&sayings[i];

再谈定位new 运算符

本书前面介绍过,定位new 运算符让您能够在分配内存时能够指定内存位置。第9 章从内置类型的角
度讨论了定位new 运算符,将这种运算符用于对象时情况有些不同,程序清单12.8 使用了定位new 运算
符和常规new 运算符给对象分配内存,其中定义的类的构造函数和析构函数都会显示一些信息,让用户能
够了解对象的历史。

http://www.jsqmd.com/news/470770/

相关文章:

  • 2026年重庆家装全屋定制价格大揭秘,看看哪家更划算 - 工业推荐榜
  • 慕尼黑上海光博会:深耕自主技术,正运动技术助力激光智造
  • 三菱PLC玩家切换到信捷平台总会有点手生,但这次的五轴示教框架绝对能让你快速上道。先看这个核心结构体定义
  • 2026更新版!10个降AIGC平台测评:继续教育降AI率必备工具推荐
  • 2026年缝包机正规厂家盘点,奇威包装性价比高口碑好 - myqiye
  • 手把手本地部署 OpenClaw (安全篇)
  • 别盲目跟风“养龙虾”!OpenClaw爆火背后,这些致命安全风险必须警惕
  • 一套完整的 MySQL 数据库设计规范
  • 湿式溢流型球磨机
  • 2026年北京实力强的旅游服务公司排名,哪家性价比高? - 工业品牌热点
  • 无界动力与生数科技达成战略合作,将在算法、数据与系统方面深度融合
  • 下垂控制的基本实现
  • 零基础从0到1学GEO优化第5课:怎么优化内容,让生成式引擎收录?
  • Windows安装Rust环境(详细教程)
  • 鸿蒙架构师修炼之道-架构师核心思维方式
  • 通过COMSOL建立的光学模型:探索魔角光子晶体激光器的能带、模式和参数化几何建模,揭示激光器...
  • 工业互联网环境下多租户多组织跨平台WMS系统源码:基于Vue2.6与.NetCore3.1的前...
  • 【IEEE出版 | EI检索】第三届数字图像处理与计算机应用国际学术会议(DIPCA 2026)
  • 2026最新!10个AI论文网站测评:MBA毕业论文写作必备工具推荐
  • AI写论文省心之选!4款AI论文生成工具,轻松应对各类论文!
  • 电商补税新规落地:电商企业合规应对要点深度解析
  • ArchivePasswordTestTool:压缩包密码恢复的开源解决方案
  • 洛雪音乐六音音源修复完全指南:从故障排查到优化播放
  • Bili2text:让视频转文字效率提升300%的智能工具 | 内容创作者必备
  • 磷酸化蛋白WB没结果?看完这篇文章再说
  • 3个核心功能:制造业的STL到STEP格式无缝转换解决方案
  • 掌握视频效率工具:提升学习与工作效率的3个秘诀
  • 网络工程师的龙虾革命,OpenClaw如何让你拥有AI网络工程师同事?
  • ThinkPad散热管理新方案:TPFanCtrl2实现智能温控
  • 3步掌握MediaMux:高效全能的视频处理方案