C++多态与虚拟:Objects 实例化(Objects Instantiation)探究

objects,instantiation · 浏览次数 : 6

小编点评

**一、Objects的创建** 对象可以创建通过**构造函数**或**析构函数**。 * **构造函数**在**类定义的构造函数**中创建对象。 * **析构函数**在**类定义的析构函数**中释放对象资源。 **二、Objects 的生命(Scope of Objects)** * **局部对象**在函数内创建和释放,并在函数执行结束后自动删除。 * **全局对象**在程序启动时创建,并在程序结束时自动删除。 * **堆对象**在**new**运算符创建时创建,并在**delete**运算符删除时自动释放。 **三、实例化** **构造函数**: - 接受一个参数,并用于初始化对象属性。 - 在构造函数中,可以执行任何必要的初始化操作。 **析构函数**: - 在对象生命结束时被调用。 - 可以执行任何必要的清理操作。

正文

一、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)探究相似的内容:

C++多态与虚拟:Objects 实例化(Objects Instantiation)探究

一、Objects的创建 依据已有的class CPoint ,我们可以产生一个或多个object(对象),或者说是产生一个instance(实体): CPoint aPoint(7.2); // aPoint._x 初始值为 7.2 aPoint.x(5.3); // aPoint._x 现值为

C++ 多态与虚拟:Class 语法语义

1.object与class:在object-oriented programming编程领域,对象(object)有更严格的定义。对象是由数据结构和用于处理该结构的过程(称为methods)组成的实体(instance)。这些方法由对象接收的消息激活。一个对象的内部数据结构与其他对象完全隔离(此属

C++多态与虚拟:运算符重载(Operator Overloading)

运算符重载:与function overloading异曲同工的是,C++提供所谓的Operator overloading。所谓operators是像 +(加)-(減)*(乘)/(除)>>(位右移)<<(位左移)之类的符号,代表一种动作。 面对operators,我们应该把他想像是一种函数,只不过

C++多态与虚拟:C++编译器对函数名的改编(Name Mangling)

如果函数名称都相同(也就是被overloaded),编译器在面对你的函数唤起动作时,究竟是如何确定调用哪个函数实体呢?事实上,编译器把所有同名的overloaded functions视为不同的函数,并且以特殊方式对它们的函数名称做了手脚,以四个Add()函数为例: 1 int Add(int a,

深入理解 C++ 中的多态与文件操作

C++ 多态 多态(Polymorphism)是面向对象编程(OOP)的核心概念之一,它允许对象在相同操作下表现出不同的行为。在 C++ 中,多态通常通过继承和虚函数来实现。 理解多态 想象一个场景,你有一个动物园,里面有各种动物,如猫、狗、鸟等。每个动物都有自己的叫声。使用面向对象编程,我们可以创

深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)

本系列深入分析编译器对于C++虚函数的底层实现,最后分析C++在多态的情况下的性能是否有受影响,多态究竟有多大的性能损失。

深度解读《深度探索C++对象模型》之C++虚函数实现分析(二)

本系列深入分析编译器对于C++虚函数的底层实现,最后分析C++在多态的情况下的性能是否有受影响,多态究竟有多大的性能损失。

深度解读《深度探索C++对象模型》之C++虚函数实现分析(三)

本系列深入分析编译器对于C++虚函数的底层实现,最后分析C++在多态的情况下的性能是否有受影响,多态究竟有多大的性能损失。

C++的动态分派在HotSpot VM中的重要应用

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持对于单继承的实现非常类似。 首先来体现一下C++的动态分派,如下: class Base1{ pub

C++ Virtual Functions

Virtual这个关键字在多态中扮演一个绝对重要的角色,只要member functions声明的前面加上virtual的关键字,他就会成为 Virtual member functions。任何一个class如果拥有virtual functions,就可以得到C++编译器的虚拟机制(virtua