qlist length 函数讲解_构造函数与析构函数

969467fd6816c62814e832ea3a2b757e.png

构造函数与析构函数

fbb52cee25e8112a0b6e6ce7b47ca955.png 54bec08b9604f776c64d94782f14058d.png

在上一期,睿喆学长为大家讲解了C++中类和对象的基本知识,包括类的定义,访问成员以及继承方面的知识。那么这一期,我们就来看一下在类和对象中另一部分重要内容——构造函数与析构函数。

969467fd6816c62814e832ea3a2b757e.png

构造函数

构造函数本身的作用呢就是在创建对象时初始化对象,为对象成员赋初值。为什么要这样做呢?因为数据成员在类定义中是不能初始化的。

即:

class Box

{

      double length = 0;

      double breadth = 0;

      double height = 0;

      ...

};

这样是错误的。

为什么不能这样定义呢?因为类只是定义了一个数据类型,数据类型是不占据存储空间的,而在类里面对数据成员赋值则会占用存储空间,因此是不可行的。

173f401a859a8dc5f8d7f40b08c1fc1c.png

构造函数本质是一种特殊的成员函数,不需要额外调用,在创建对象时就会自动被执行。

此外,构造函数的名字要与类名保持一致且不能指定返回类型。

即:

class Box

{

private:

      double length;

      double breadth;

      double height;

public:

      Box();

      Box(double l,double b,double h);

};

Box::Box()

{}

Box::Box(double l,double b,double h)

{

    length = l;

    breadth = b;

    height = h;

}

int main()

{

    Box box(1,2,3);

}

以上定义了两个构造函数,其中Box()为无参构造函数,这样一个构造函数可以使我们在创建对象时不立刻对数据成员初始化,而可以在后续的操作中再赋初值。此外,由于创建对象的操作一般是在类外进行的,因此构造函数生命时采用public。

173f401a859a8dc5f8d7f40b08c1fc1c.png

没有无参构造函数是会报错的,那么就奇怪了,我们在刚开始接触类的时候都没有写构造函数呀,为什么没有报错呢?因为此时,系统会自动生成一个无参构造函数。当然,如果你自己已经定义了一个构造函数,那么系统就不会再为你自动生成了。比如在上述例子中将Box()删除,则就会报错。

173f401a859a8dc5f8d7f40b08c1fc1c.png

初始化列表与拷贝构造函数

关于初始化列表其实就是构造函数可以写成如下形式:

即:

class Box

{

private:

      double length;

      double breadth;

      double height;

public:

      Box();

      Box(double l,double b,double h);

};

Box::Box()

{}

Box::Box(double l,double b,double h)

:length(l),breadth(b),height(h)

{}

int main()

{

    Box box(1,2,3);

}

或:

class Box

{

private:

      double length;

      double breadth;

      double height;

public:

      Box(){}

      Box(double l,double b,double h):

      length(l),breadth(b),height(h){}

};

int main()

{

    Box box(1,2,3);

}

而拷贝构造函数的作用呢,就是用一个已经生成的对象来初始化另一个同一类的对象。

即:

class Box

{

private:

      double length;

      double breadth;

      double height;

public:

      Box(){}

      Box(double l,double b,double h):

      length(l),breadth(b),height(h){}

      Box(const Box& o):length(o.l),

      breadth(o.b),height(o.h){}

};

int main()

{

    Box box1(1,2,3);

    Box box2 = box1;

    //或Box box2(box1)

}

173f401a859a8dc5f8d7f40b08c1fc1c.png

析构函数

如果说将构造函数的作用描述为构建,那么析构函数的作用就是“分解”或者说“清理”,比如当类中开辟动态内存后,在程序结束时就需要释放内存,如果我们将释放语句放入析构函数中则就会在系统运行结束后自动调用。

例如:

class Box

{

private:

   double length;

   double breadth;

   char* name;

public:

   Box(){}

   Box(double l,double b,char* n)

   {

        length = l;

        breadth = b;

        name = new char [5];

        strcpy(name,n);

   }

   ~Box()

   {

       delete(name);

   }

};

int main()

{

    Box box(1,2,"box");

}

a8dd49aede1c8bbc36e6214800f6c1a2.png

南京理工大学本科生学业指导中心

微信公众号 : 导学小纸条

地址:逸夫楼201

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值