zoukankan      html  css  js  c++  java
  • C++学习之一:构造函数和析构函数

       今天我同事问我,析构函数里什么都不写,那要它来干什么呢?咋一想似乎是没什么作用哦,就是一个空函数而已。后来想一想不对。下面请让我细细道来。

       首先说一下对象的生命周期。对象在声明或new时被创建,在离开作用域时被销毁。在创建时,调用自身的构造函数;在销毁时调用析构函数。

    所以有时候会有这样的错误的认识:对象是调用构造函数创建的,在调用析构函数时被销毁的。这种想法也就是前文提到的。

       实际上,对象创建的过程是这样的:

      1.根据类的大小分配一块内存

      2.调用构造函数对这块内存进行初期化

      对象销毁的过程是这样的:

      1.调用析构函数执行清理工作

      2.销毁内存

    所以对象创建与构造函数无关,对象销毁时与析构函数无关(假设,构造函数与析构函数都承诺不抛出异常)。

    为了验证上面所述来看一个例子。

     1 using namespace std;
     2 #include <iostream>
     3 
     4 class Foo{
     5 public:
     6     Foo(){
     7         cout << &(*this) << endl;
     8     }
     9     ~Foo(){
    10     }
    11     void PrintHello(){
    12         cout<< "hello"<<endl;
    13     }
    14 };
    15 void main(){
    16 
    17     Foo foo;
    18     foo.~Foo();
    19     foo.PrintHello();
    20 
    21 }
    View Code

     第7行的输出结果是“C6F7AF”,而PrintHello函数的调用仍然是可以的。

    补充一下构造函数和析构函数的特点(摘自互联网)。

    构造函数 
    (1)构造方法的方法名必须与类名相同。 
    (2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。 
    (3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。 
    (4)构造方法不能由编程人员调用,而要系统调用。 
    (5)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。 
    (6)构造方法可以重载,以参数的个数,类型,或排列顺序区分

    析构函数析构函数(destructor)也是一种成员函数,但它的作用与构造函数相反,
    用来在系统释放对象前做一些清理工作,如利用delete运算符释放临时分配的内存,
    清零某些内存单元等.当一个对象生存期结束时,系统会自动调用该对象所属类的析构函数; 

    构造函数的名称与类名相同,而析构函数的名称必须在类名前加上"~"符号;

    注意,构造函数和析构函数不能指定任何返回值类型,包括void返回类型; 

  • 相关阅读:
    [PHP]防止表单重复提交的几种方法
    [PHP]PHP的session机制,配置与高级应用
    苹果IOS开发者账号总结--发布应用APP时team name是否可以随意写?
    转:《走出软件作坊》读书笔记
    英语学习技巧摘要
    英语学习规划与目标
    转:人生成功必读的经典语录200条
    转载: PHP错误:Warning: Cannot modify header information
    jQuery Mobile页面返回无需重新get
    mongodb type it for more
  • 原文地址:https://www.cnblogs.com/zinc88/p/3181009.html
Copyright © 2011-2022 走看看