子对象

  当一个类的成员是某一个类的对象时,该对象就为子对象。子对象实际就是对象成员。如:

class A
{
 public:
  …
 private:
  …
};
class B
 {
  public:
   …
  private:
   A a;
   …
 };

  其中,B类中成员a就是子对象,它是A类的对象作为B类的成员。

  在类中出现了子对象或称对象成员时,该类的构造函数要包含对子对象的初始化,通常采用成员初始化表的方法来初始化子对象。在成员初始化表中包含对子对象的初始化和对类中其他成员的初始化。下面举一例子说明成员初始化的构造。

#include

class A
{
public:
A(int i, int j) { A1=i; A2=j; }
void print() { cout< private:
int A1, A2;
};

class B
{
public:
B(int i, int j, int k):a(i, j), b(k)
{
}
void print();
private:
A a; file://子对象
int b;
};

void B::print()
{
a.print();
cout< }

void main()
{
B b(6, 7, 8);
b.print();
}

  该程序的输出结果为:

  6,7
  8

  其中,a(i, j), b(k)是成员初始化表,它有二项,前一项是给子对象a初始化,其格式如下:

   <子对象名> (<参数表>)

  后一项是给类B的数据成员b初始化。这一项也可以写在构造函数的函数体内,使用赋值表达式语句

   b = k;

  给类B的数据成员初始化。

  堆对象

  所谓堆对象是指在程序运行过程中根据需要随时可以建立或删除的对象。这种堆对象被创建在内存一些空闲的存储单元中,这些存储单元被称为堆。它们可以被创建的堆对象占有,也可以通过删除堆对象而获得释放。

  创建或删除堆对象时,需要如下两个运算符:

   new

   delete

  这两个运算符又称为动态分配内存空间运算符。new相当于C语言中malloc()函数,而delete相当于C语言中free()函数。

  1. 运算符new的用法

  该运算符的功能是用来创建堆对象,或者说,它是用来动态地创建对象。

  new运算符使用格式如下:

  new <类型说明符> (<初始值列表>)

  它表明在堆中建立一个由<类型说明符>给定的类型的对象,并且由括号中的<初始值列表>给出被创建对象的初始值。如果省去括号和括号中的初始值,则被创建的对象选用缺省值。

  使用new运算符创建对象时,它可以根据其参数来选择适当的构造函数,它不用sizeof来计算对象所占的字节数,而可以计算其大小。

  new运算符返回一个指针,指针类型将与new所分配对象相匹配,如果不匹配可以通过强制类型的方法,否则将出现编译错。

  如果new运算符不能分配到所需要的内存,它将返回0,这时的指针为空指针。

  运算符new也可以用来创建数组类型的对象,即对象数组。其格式如下:

   new <类名> [<算术表达式>]

  其中,<算术表达式>的值为所创建的对象数组的大小。如:

   A *ptr;
   ptr = new A[5];

  new还可用来创建一般类型的数组。如:

   int *p;
   p = new int[10];

  使用new[]创建的对象数组或一般数组时,不能为该数组指定初始值,其初始值为缺省值。

  2. 运算符delete的用法

  该运算符的功能是用来删除使用new创建的对象或一般类型的指针。其格式如下:

   delete <指针名>

  例如:

   A *ptr;
   ptr = new A(5, 6);
   delete ptr;

  运算符delete也可用来删除使用new创建对象数组,其使用格式如下:

   delete[] <指针名>

  同样,delete也可以删除由new创建的一般类型的数组。如:

   int *p;
   p = new int[10];
   delete[] p;

  使用运算符delete时,应注意如下几点:

   (1) 它必须使用于由运算符new返回的指针;

   (2) 该运算符也适用于空指针(即其值为0的指针);

   (3) 指针名前只用一对方括号符,并且不管所删除数组的维数,忽略方括号内的任何数字。

  下面举一例子说明new运算符和delete运算符的使用方法。

#include

class AA
{
public:
AA(int i, int j)
{
A=i; B=j;
cout<<"构造函数./n";
}
~AA() { cout<<"析构函数./n"; }
void print();
private:
int A, B;
};

void AA::print()
{
cout< }

void main()
{
AA *a1, *a2;
a1 = new AA(1, 2);
a2 = new AA(5, 6);
a1->print();
a2->print();
delete a1;
delete a2;
}

   该程序的输出结果为:

    构造函数.
    构造函数.
    1, 2
    5, 6
    构造函数.
    构造函数.

  从程序中可以看到:用new创建对象时,要调用构造函数,用delete删除对象时,要调用析构函数。如果创建或删除的时对象数组,对象数组有多少,就调用多少次构造函数或构造函数。

  在实际应用中,经常对于new运算符返回的指针进行检验,看是否分配了有效的内存空间。结合本例给出检验方法如下:

  if (!a1)
   {
    cout<<"Heap erroe!/n";
    exit(1);
   }

  下面再举一个使用new和delete运算符对一般指针和数组的例子。

#include
#include

void fun()
{
int *p;
if (p = new int)
{
*p = 5;
cout<<*p< delete p;
}
else
cout<<"Heap error!/n";
}

void main()
{
fun();
int *pa;
pa = new int[5];
if (!pa)
{
cout<<"Heap error!/n";
exit(1);
}
for (int i=0; i<5; i++)
pa[i] = i+1;
for (i=0; i<5; i++)
cout<<pa[i]<<" ";
cout< delete[] pa;
}

C++子对象和堆对象相关推荐

  1. 栈对象、堆对象、静态对象的比较

    栈对象的优势是在适当的时候自动生成,又在适当的时候自动销毁,不需要程序员操心:而且栈对象的创建速度一般较堆对象快,因为分配堆对象时,会调用operator new操作,operator new会采用某 ...

  2. C++中堆对象的构造函数和析构函数逆向分析

    实验环境: 操作系统:Windows XP Professional Service Pack 3 集成开发环境:Microsoft Visual C++ 6.0 构建版本:Debug版本 实验代码: ...

  3. JavaScript 的自定义对象 、内置对象、 浏览器对象(window对象以及子对象)、Dom对象

    JS 中的 Object从本质上看,Object 是一个构造函数,用于创建对象. console.dir(Object); //ƒ Object() var obj = new Object(1); ...

  4. java面向对象的概念,Java类、引用变量与堆对象

    一,面向对象概念 1.类型(类) 指一个名词概念,如:老师,学生,图书 2.引用(变量) 指引用具体概念实例的代词,如:某人.某物 3.对象(东西) 指具体概念的个体实例,如:张无忌这个人. 4.行为 ...

  5. 逆向看C++ new申请堆对象的构造,析构函数调用

    转自:coNgY1 先来放总结,以后回看的时候方便回忆: 对new 而言,如果是空类也会分配一字节. 对 new x[],这种在地址最前面会多分配四字节的空间来保存分配的对象个数. new x[]这种 ...

  6. java堆对象_无法为对象堆保留足够的空间

    回答(25) 2 years ago 使用 -XX:MaxHeapSize=512m (或您需要的任何大数字)运行JVM(或简称 -Xmx512m ) 2 years ago 这也可能是因为在32位H ...

  7. 《面向对象程序设计》课程设计

    一.课程设计题目 结合实际,用面向对象程序设计的思想设计一个应用实例,要求用到下面设计要求中提到的知识点5个以上. 二.设计要求 通过此次课程设计,更好地掌握面向对象程序设计的基本概念及编程方法,进一 ...

  8. 只在堆上或只在栈上定义对象

    转自:http://blog.csdn.net/g5dsk/article/details/4775144 代码: [cpp] view plaincopyprint? class OnlyHeapC ...

  9. [.NET] 建构子中传递子对象的对象

    在设计对象继承的时候,父对象建构子会需要一些参数,这些参数可以由子对象建构子透过base关键词来提供. namespace Test001 {public class ParentClass{// C ...

最新文章

  1. 喷涂机器人保养应该注意的七个事项
  2. 赛门铁克公布Q3财报 亏损68亿美元
  3. I2C和SPI异同及使用注意
  4. android 半浮层框架,GitHub - Jodragon/AnyLayer: Android稳定高效的浮层创建管理框架
  5. Siamese Network理解
  6. 什么是内容电商?核心是“内容”
  7. let声明变量时的特点
  8. [ABP开源项目]--vue+vuex+vue-router+EF的权限管理系统
  9. 宁波户外广告调查报告
  10. Hibernate上路_18-Hibernate查询方式
  11. html+css常用代码(前端必备)
  12. 计算机操作系统教程徐甲同pdf,《操作系统实践教程》.pdf
  13. python单位根检验平稳性怎么看是否平稳_Python ADF单位根检验查看结果实现方法...
  14. 用虚拟串口实现串口数据收发
  15. 彻底解决Tensorflow2.0 使用tensorflow_datasets出现unbalanced parenthesis错误
  16. php属于哪种语言,php是哪种类型的语言
  17. Linux电脑睡眠后黑屏打不开,电脑睡眠后黑屏打不开怎么解决
  18. lumen5.5 使用 jwt-auth1.0 笔记
  19. 从键盘上输入一个字符,如果它是小写字母,则把它转换成大写字母输出;否则,直接输出。
  20. AStar路径规划算法

热门文章

  1. 怎么把一个RPM包安装到不同的目录?
  2. 2021年科技赋能中医药产业发展报告
  3. 互联网日报 | 理想汽车交付量突破30000辆;美团王慧文正式退休;寺库打造首个奢侈品直播基地...
  4. jfinal连接oracle_JFinal框架操作oracle数据库
  5. cloub spring 拦截器_Spring Cloud Gateway之全局异常拦截器
  6. cydia软件路径_Cydia报错解决大全
  7. pythonweb开发工作内容_我的第一个python web开发框架(5)——开发前准备工作(了解编码前需要知道的一些常识)...
  8. 2019传智python就业班视频_2019黑马JAVAEE57期基础班就业班(全套)
  9. 需求分析师的基本功:逻辑思维、逻辑分析与逻辑表达
  10. 2015年《大数据》高被引论文 Top10