构造函数和构析函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数和构析函数相关的知识,希望对你有一定的参考价值。

目前能想到的:

构造函数

  在类对象被创建时候执行,名字与类名相同,不返回任何类型(即使void),可以用来给某些成员变量设置初始值。

  不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。

  构析函数在类对象被销毁时候执行释放内存等功能。

  构造函数必须是 public 属性的,否则创建对象时无法调用。设置为 private、protected 属性也不会报错,但是没有意义。

  构造函数没有返回值,因为没有变量来接收返回值,即使有也毫无用处,这意味着:

    • 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
    • 函数体中不能有 return 语句。

  关于构造函数的含参初始化问题:

  在栈上创建对象时,实参位于对象名后面,例如Student stu(“参数”)在堆上创建对象时,实参位于类名后面,例如new Student("参数")

  如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作。类名(){}

一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。

实际上编译器只有在必要的时候才会生成默认构造函数,而且它的函数体一般不为空。默认构造函数的目的是帮助编译器做初始化工作,而不是帮助程序员。这是C++的内部实现机制,这里不再深究,初学者可以按照上面说的“一定有一个空函数体的默认构造函数”来理解。

最后需要注意的一点是,调用没有参数的构造函数也可以省略括号。对于示例2的代码,在栈上创建对象可以写作Student stu()Student stu,在堆上创建对象可以写作Student *pstu = new Student()Student *pstu = new Student,它们都会调用构造函数 Student()

 然后是调用顺序:

以及默认生成问题;    

  附上构造函数的示例

 1 #include<iostream>
 2 using namespace std;
 3 class Line
 4 {
 5     public:
 6         void setlength(double len);
 7         double getlength(void);
 8         Line();//构造函数
 9     private:
10         double length;
11 };
12 Line::Line(void)
13 {
14     cout<<"Object is being created"<<endl;
15 }
16 void Line::setlength(double len)
17 {
18     length=len;
19 }
20 double Line::getlength(void)
21 {
22     return length;
23 }
24 int main()
25 {
26     Line line;
27     //设置长度
28     line.setlength(6.0);
29     cout<<line.getlength()<<endl;
30     return 0;
31 }

然后是构析函数:

类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。

析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。

析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 class Line
 4 {
 5     public:
 6         void setlength(double len);
 7         double getlength(void);
 8         Line();//构造
 9         ~Line();//析构
10     private:
11         double length;
12 };
13 //成员函数定义,构造和析构
14 Line::Line(void)
15 {
16     cout<<"Object is being created"<<endl;
17 }
18 Line::~Line(void)
19 {
20     cout<<"Object is being deleted"<<endl;
21 }
22 void Line::setlength(double len)
23 {
24     length=len;
25 }
26 double Line::getlength(void)
27 {
28     return length;
29 }
30 int main()
31 {
32     Line line;
33     line.setlength(6.0);
34     cout<<"Length of line"<<line.getlength()<<endl;
35     return 0;
36 }

然后几点要注意的地方:

  

以上是关于构造函数和构析函数的主要内容,如果未能解决你的问题,请参考以下文章

php 抽象类接口和构析方法

构析函数和构造函数

PHP函数

字符串函数构析

缺省函数

在 Visual Studio 中创建构造函数的代码片段或快捷方式