浅谈C++构造函数和析构函数
什么是构造函数?
构造函数是一种特殊的函数,一般跟类是连在一块的,根据类被创造的时候而被调用。构造函数和普通的函数一样,也是可以被重载的。通常构造函数用来初始化类成员,即为对象成员变量赋初始值。
构造函数在代码中的样子如下:
class Human
{
public:
Human();//此处声明一个构造函数
{
//此处构造函数代码
}
};
构造函数在类声明之外是如何实现的?
class Human
{
public:
Human();
};
Human::Human() //此处::符号为作用域解析符
{
//此处构造函数代码
}
重载构造函数
class Human
{
public:
Human()
{
//默认的构造函数
}
Human(string name)
{
//重载构造函数
}
};
看完重载构造函数,有人可能会想为啥?有啥用?通过一个类来理解。
class printf
{
public:
printf() = default; //默认构造函数
printf(int)
{
//整型输出
}
printf(double)
{
//double型输出
}
printf(float)
{
//float型输出
}
};
这个过程中,重载了3次构造函数,分别用于输出整型、浮点型输出等。因为我们通常利用构造函数初始化类的成员变量,特别是私有型private里的成员,我们可以通过重载构造函数将成员变量放在不同的重载处达到不同的效果。
当然,我们也可以没有默认构造函数,直接上有参数的构造函数,如下:
class Human
{
private:
int age;
public:
Human(int Myage)
{
age = Myage;
cout << "I am " << age << " years old!" << endl;
}
};
int main()
{
Human Nick(23);
int x;
cin >> x;
}
最后简单描述初始化列表的构造函数,这是利用构造函数初始化成员的方式之一,代码如下:
class Human
{
private:
string name;
int age;
public:
Human(string Myname = "Xiaoming",int Myage = 18)
:name(Myname),age(Myage)
{
cout << "My name is: " << name <<endl;
cout << "My age is : " << age << endl;
}
}
int main()
{
Human Xiaoming;
Human Nick("Nick",23);
int x;
cin >> x;
}
以上这个初始化成员列表若不输入,则默认输出,除非输入改变默认值。
析构函数
析构函数定义
析构函数与构造函数刚好相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
长这个样子:
class Human
{
~Human(); //这里注意有个~符号(腭化符号)
};
其他部分基本与构造函数差不多,代码解释:
class Human
{
public:
Human()
{
//默认的构造函数
}
~Human()
{
//析构函数
}
};
析构函数和构造函数的作用刚好相反,当对象并没有在作用域内或者被删除的时候,都可以调用析构函数,所以我们可以用析构函数来释放动态分配的内存和释放其他资源。在类中可以封装一个析构函数。但是要注意的是,析构函数不能重载!每个类中只有一个析构函数!
<说的不好的地方希望各位大佬指出,有错的地方直接批评,万分感谢!>