一、Objects的创建 

  依据已有的class CPoint ,我们可以产生一个或多个object(对象),或者说是产生一个instance(实体):

CPoint aPoint(7.2); // aPoint._x 初始值为 7.2
aPoint.x(5.3); // aPoint._x 现值为 5.3

  这样的objects可能放在函数的stack之中(对象是在函数内部创建的,例如在函数的作用域内),也有可能放在程序的data segment中(对象是在函数外部创建的,例如在全局作用域或静态作用域内)。我们也可以这样来产生一个objects:

CPoint* pPoint = new CPoint(3.6); // pPoint->_x 初 值 为 3.6
pPoint->x(5.3); // pPoint->_x 现值为 5.3
delete pPoint;

  使用new operator产生的objects,是放在程序的heap(堆)之内。

  不管哪一种方式来产生objects,我们依据某个class产生一个object的动作称为instantiation(实例化)。object的诞生和死亡时,会自动调用class中特殊的member function,称为constructor 和 destructor。

  Constructor:object诞生时会自动调用的class member functions称为构造函数,此函数的命名必须与class相同,参数可以自定,没有返回值。class可以有一个以上的constructors,其中无参数的那个称为default constructor;只有一个参数,并且以该class为参数类型的,称为copy constructor。

  Destructor :object生命结束时会自动调用的class member function称为析构函数,一个class只能有一个destructor,没有参数,没有返回值,其命名必须与class相同,并以~为前置符号。

二、Objects 的生命(Scope of Objects)

 由于objects可能位于stack或heap或data segment之中,所以objects的生命周期就有差异。

  1. 放在stack之中的称为local objects,它的生命随着objects的产生产而开始,随着所在函数的执行结束而结束。

  2.放在data segment之中的称为gobal objects,它的生命随着程序的开(比程序进入点还早),随着程序的结束而结束。

  3.放 在heap之中的称为heap objects,它的生命随着new operator而开始,随着delete operator而结束。    

  下面这个例子出现了刚刚所提到的三种不同的生命周期的objects。从程序的执行结果,我们可以清楚的看到三种objects的生命范围。其中用到的constructors(构造函数)和destructors(析构函数)。這個例子出現剛剛所提的三種不同生命週期的 objects。從程式的執行結果,
我們可以清楚看到三種 objects 的生命範圍。其中用到的 constructors(建構式)和 destructors。

#include <iostream.h>
#include <string.h>
class CDemo
{
  public:
     CDemo(const char* str); // constructor
     ~CDemo(); // destructor
  private:
    char name[20];
};
CDemo::CDemo(const char* str) // constructor
{
  strncpy(name, str, 20);
  cout << "Constructor called for " << name << '\n';
}
CDemo::~CDemo() // destructor
{
  cout << "Destructor called for " << name << '\n';
}
void func()
{
  CDemo LocalObjectInFunc("LocalObjectInFunc");
  static CDemo StaticObject("StaticObject");
  CDemo* pHeapObjectInFunc = new CDemo("HeapObjectInFunc");
  cout << "Inside func" << endl;
}
CDemo GlobalObject("GlobalObject");
void main()
{
CDemo LocalObjectInMain("LocalObjectInMain");
CDemo* pHeapObjectInMain = new CDemo("HeapObjectInMain");
cout << "In main, before calling func\n";
func();
cout << "In main, after calling func\n";
}

  执行结果如下(注意,上例有new的动作,却没有delete,是个错误示范):

1. Constructor called for GlobalObject
2. Constructor called for LocalObjectInMain
3. Constructor called for HeapObjectInMain
4. In main, before calling func
5. Constructor called for LocalObjectInFunc
6. Constructor called for StaticObject
7. Constructor called for HeapObjectInFunc
8. Inside func
9. Destructor called for LocalObjectInFunc
10. In main, after calling func
11. Destructor called for LocalObjectInMain
12. Destructor called for StaticObject
13. Destructor called for GlobalObject

C++多态与虚拟:Objects 实例化(Objects Instantiation)探究的更多相关文章

  1. Django objects.all() ,objects.get() ,objects.filter()之间的区别

    ret=UserInfo.objects.all() all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据. ret=UserIn ...

  2. 多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量

    多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了vir ...

  3. 多态与虚拟 : 物件导向的精髓 (侯捷在石器时代对OO的理解)

    [自序]虑而後能得(自序)故事接触 C++ 大约是 1989 年的事.那时候的 PC 以现在的眼光看,除了「蛮荒」之外没有更合适的形容词了.横扫千军的 Windows 3.0 还没有诞生,如今以 C+ ...

  4. advanced dom scripting dynamic web design techniques Chapter 2 CREATING YOUR OWN REUSABLE OBJECTS

    JavaScript is all about objects. Objects are the foundation of everything, so if you’re unfamiliar w ...

  5. The method below converts an array of objects to a DataTable object in C#.

    http://www.c-sharpcorner.com/blogs/dynamic-objects-conveting-into-data-table-in-c-sharp1 public stat ...

  6. Post Complex JavaScript Objects to ASP.NET MVC Controllers

    http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/     Post ...

  7. JavaScript- The Good Parts Chapter 3 Objects

    Upon a homely object Love can wink.—William Shakespeare, The Two Gentlemen of Verona The simple type ...

  8. Objects

    Obeject Object Object representation and value representation Subobjects Polyomrphic objecets Alignm ...

  9. Objects First with Java 读书笔记 (1)

    umm...这学期被发了助教Java的任务,为了避免误人子弟从零开始现学.课是英语教学,就不逐字翻译了,方便记. 参考书目:Objects First with Java - A Practical ...

  10. 【jdk源码2】Objects源码学习

    在学习上一个类TreeMap的时候,提到了这个类,这个类是jdk1.7新增的,里面有很多实用的方法.就是一个工具类,熟悉以后,如果里面有已经实现的方法,那么就不要再去实现了,省时省力省测试. 一.简单 ...

随机推荐

  1. PyQt5报错:This application failed to start because no Qt platform plugin could be initialized

    问题背景: 想使用PyQt5来创建一个可视化窗口,先在pycharm里面安装PyQt5,版本为5.14.0.之后在代码中调用此包:from PyQt5 import QtCore, QtGui, Qt ...

  2. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第2章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 出处:2.2.6 Windows内存布局 原文: segment heap:用于Universal Windows Platform程序,它提供了 ...

  3. 使用FlashFXP,密钥方式连接Amazon的CE2实例

    操作步骤如下: 1.选择"站点" -> "密钥管理器" 2.选择"导入" 3.名称随意填, 类型选择"用于SFTP的RSA/ ...

  4. Java 包和 API 深度解析:组织代码,避免命名冲突

    Java 包和 API Java 中的包 用于将相关的类分组在一起.可以将其视为文件目录中的一个文件夹.我们使用包来避免名称冲突,并编写更易于维护的代码. 包分为两类: 内置包(来自 Java API ...

  5. 狂神说Java——Mybatis学习笔记

    前言:配合狂神老师的教学视频使用效果更佳: https://www.bilibili.com/video/BV1NE411Q7Nx/?spm_id_from=333.1007.top_right_ba ...

  6. k8s之operator

    背景 数字经济的兴起推动了云计算.物联网.大数据行业的快速蓬勃发展,对数据中心提出了更高的要求,同时,用户对于数据库运维自动化的需求越来越高,数据库即服务的需求越来越强烈. 随着k8s的普及以及云原生 ...

  7. flutter3-macOS桌面端os系统|flutter3.x+window_manager仿mac桌面管理

    原创力作flutter3+getX+window_manager仿Mac桌面系统平台Flutter-MacOS. flutter3_macui基于最新跨端技术flutter3.19+dart3.3+w ...

  8. 日志分析qsnctfwp

    使用工具:http Logs Viewer 使用 http Logs Viewer 载入 access.log 按照 Status 排序 其中大量 Status 为404的日志不难推断出,这是在进行目 ...

  9. mysql 必知必会整理—数据库的维护[十八]

    前言 简单介绍一下数据库的维护. 正文 像所有数据一样,MySQL的数据也必须经常备份. 由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据. 但是,由于这些文件总是处 ...

  10. docker 应用篇————docker 自定义网络[十八]

    前言 看下如何自定义网络. 正文 在了解自定义网络之前呢? 需要明白一件事. 就是其实我们在启动docker的时候是有默认参数的. docker run -d -p --name tomcat01 - ...