类的初始化、赋值和析构

类的初始化

一般情况下,对于类的初始化操作,使用构造函数来完成类的初始化操作。要想理解和学习类的初始化,主要要弄明白如下几个问题:

(1)C++提供了哪些初始化类的方法?

(2) 为什么要构造函数来初始化类?

(3) 使用构造函数初始化类具体做什么?

C++提供了哪些初始化类的方法

C++提供两类对于类的初始化方法:

第一类:从C语音继承来的显示初始化列表;

class Data
    {
    public:
        int ival;
        char *pstr;
    };

    Data local2 = { 1024, "Anna Livia Plurabelle" };

缺点:

  • 只能被应用在所有数据成员都是共有的类对象上(public);
  • 不支持使用数据封装和抽象数据类型;

优点:

  • 当像一个数据结构中注入大量常量值的时候

第二类:构造函数

构造函数的概念从很多地方都可以找到,我的理解为,构造函数是C++为程序员提供的自动的初始化类的工具(需要程序员显示的指定)。

那么既然是C++为我们提供的工具,那么我们该如何使用,并且应该注意什么呢?

(1)如何定义构造函数

构造函数是类中有类同名的函数,是没有返回值的函数,具体的功能为实现类成员变量的初始化。对于初学者来说,很容易有如下误解:

  • 缺省构造函数(无参数的构造函数)为系统默认提供的,即具体的开发的同学不用实现,系统会自动调用。这样的想法是十分错误的,默认情况下,如果一个类没有实现任何构造函数,那么当定义一个类的时候,相当于该类没有被初始化。
  • 只能有一个构造函数;构造函数和其他函数一样,满足函数的一些特质,比如说函数的重载,只是要注意,构造函数没有任何函数类型和返回值类型;

(2)系统不会默认的为一个类提供默认构造函数,如果一个类没有定义相关的构造函数,那么再使用这个类的时候,类的成员变量是没有初始化的(上面已经说了,这里着重所一下;

第三类:缺省按成员初始化

第四类:缺省按成员赋值

为什么要初始化

一般情况下,使用类的构造函数对于类的来进行初始化操作。个人觉得,类的初始化操作,主要是由于如下两个层面的部分考虑;

1:方便程序员高效编程;

举例一(一般情况下的使用):

class Demo
  {
  public:
      char *pneed_new_str1;
      char *pneed_new_str2;   
  };

  class DemoUser
  {
  public:
      Demo *use_demo1;
      Demo *use_demo2;
  };

类定义如上,DemoUser类包含多个Demo类的成员,如果Demo类有需要从堆上面申请空间的变量等初始化操作,那么需要在DemoUser类中分别实现,并且由于Demo类的类型相同,且有多个Demo的成员变量,需要重复写很多代码,复杂、效率低、容易出问题且出现了问题不好定位,但是如果有Demo类的相关的构造函数的话,那么就可以将程序员从这些复杂又无用的操作中解放出来。

带构造函数的版本如下:

#define DEFAULT_STR_LEN 10240   //默认的字符串长度    class Demo
  {
    public:
         Demo()
         {
             pneed_new_str1 = new char[DEFAULT_STR_LEN];
             pneed_new_str2 = new char[DEFAULT_STR_LEN];
         }
  public:
       char *pneed_new_str1;
       char *pneed_new_str2;   
  };

  class DemoUser
  {
    public:
         DemoUser()
         {
             use_demo1 = new Demo();
             use_demo2 = new Demo();
         }
   public:
        Demo *use_demo1;
        Demo *use_demo2;
  };

    注:    (1)作为demo,这里省去了new的合法性判断,默认new不会出错,每次都成功;    (2)本例在构造函数中直接进行了空间的申请,意在说明方便性,考虑到一般情况下构造函数中只会对变量置NULL,在init函数中申请相关的空间,特在此处说明。        (就算是置NULL,也能重复体现出构造函数的方便性,只是new更容易让大家理解);

举例2(继承层面的使用):

2:类的使用的安全性;

未完待续
原文链接: https://www.cnblogs.com/mr-sunny/archive/2013/01/28/2879980.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/77078

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午5:46
下一篇 2023年2月9日 下午5:47

相关推荐