![969467fd6816c62814e832ea3a2b757e.png](https://i-blog.csdnimg.cn/blog_migrate/f4c8513be4823179ac94fe33205293bc.png)
构造函数与析构函数
![fbb52cee25e8112a0b6e6ce7b47ca955.png](https://i-blog.csdnimg.cn/blog_migrate/c0697d251996d56d4e56eee71bdec562.jpeg)
![54bec08b9604f776c64d94782f14058d.png](https://i-blog.csdnimg.cn/blog_migrate/c6a2523600364943ac470ed4bc66e707.png)
在上一期,睿喆学长为大家讲解了C++中类和对象的基本知识,包括类的定义,访问成员以及继承方面的知识。那么这一期,我们就来看一下在类和对象中另一部分重要内容——构造函数与析构函数。
![969467fd6816c62814e832ea3a2b757e.png](https://i-blog.csdnimg.cn/blog_migrate/f4c8513be4823179ac94fe33205293bc.png)
构造函数
构造函数本身的作用呢就是在创建对象时初始化对象,为对象成员赋初值。为什么要这样做呢?因为数据成员在类定义中是不能初始化的。
即:
class Box
{
double length = 0;
double breadth = 0;
double height = 0;
...
};
这样是错误的。
为什么不能这样定义呢?因为类只是定义了一个数据类型,数据类型是不占据存储空间的,而在类里面对数据成员赋值则会占用存储空间,因此是不可行的。
![173f401a859a8dc5f8d7f40b08c1fc1c.png](https://i-blog.csdnimg.cn/blog_migrate/32f2d7deeadb27602280c75808cb05ac.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](https://i-blog.csdnimg.cn/blog_migrate/32f2d7deeadb27602280c75808cb05ac.png)
没有无参构造函数是会报错的,那么就奇怪了,我们在刚开始接触类的时候都没有写构造函数呀,为什么没有报错呢?因为此时,系统会自动生成一个无参构造函数。当然,如果你自己已经定义了一个构造函数,那么系统就不会再为你自动生成了。比如在上述例子中将Box()删除,则就会报错。
![173f401a859a8dc5f8d7f40b08c1fc1c.png](https://i-blog.csdnimg.cn/blog_migrate/32f2d7deeadb27602280c75808cb05ac.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](https://i-blog.csdnimg.cn/blog_migrate/32f2d7deeadb27602280c75808cb05ac.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](https://i-blog.csdnimg.cn/blog_migrate/6f5d946c75eeaa7fe562a031021d19aa.jpeg)
南京理工大学本科生学业指导中心
微信公众号 : 导学小纸条
地址:逸夫楼201