一、构造函数
C++提供构造函数来处理对象的初始化,构造函数是一种特殊的成员函数,与其他的成员函数不同,不需要用户来调用他,而是在建立对象时自动执行。
它的特点是:函数名和类名相同,没有返回值,可以重载
如果程序中未声明,则系统自动产生出一个默认的构造函数,默认的构造函数时不带参数的。比如:Student t;这是就会调用默认的构造函数。在定义对象时指定成员的初始值时,系统不会自动生成一个有参的构造函数,需要自己生成。
由结果可知:全局对象的构造函数优先于main函数执行
一、析构函数
析构函数也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名前面加了一个“~”符号。
特点:没有参数,没有返回类型,不能被重载,如果没有定义析构函数,编译器会自动生成一个默认的析构函数。
当对象的生命周期结束的时候,会自动调用析构函数,具体来说一下情况会调用:
1)在函数中定义了一个局部对象,在函数结束时,对象释放会调用析构函数
2)静态局部对象在函数调用时对象并不释放,因此不调用析构函数,只在main函数结束或者调用exit函数结束程序时,才调用static局部变量的析构函数。
3)如果定义了一个全局变量,则在程序的流程离开其作用域(在main函数结束或者调用exit函数时),调用该全局的对象的析构函数。
4)用new运算符动态建立了一个对象,当用delete运算符释放该对象时,先释放该对象的析构函数。
析构函数的作用并不是删除对象,而是在撤销对象占用内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。
由结果可知:析构函数与构造函数的顺序相反。
析构函数的显示调用:t.~Test
一、转换构造函数
特点:单个参数的构造函数
作用:将任意类型转换为类类型,不能默认生成。
Test t = 10; //初始化,带一个参数的构造函数,这里的转换构造函数充当的是普通构造函数的作用。
t = 20;// 1、赋值,调用转换构造函数,将20这个整数转换成类类型,构建了一个临时对象Test(20);2、调用运算符重载,将临时对象赋值给t对象
使用explicit关键词,是转换构造函数失效!
一、初始化列表
·const成员的初始化只能在构造函数初始化列表中进行,必须在每个构造函数中初始化
·引用成员的初始化也只能在构造函数初始化列表中进行
·对象成员(对象所对应的类没有默认构造函数)的初始化,也只能在构造函
数初始化列表中进行,这里的对象成员是指类里面包含的类的对象成员。
代码示例:
#include<iostream>
using namespace std;
class Object
{
public:
Object(int num = 0):num_(num),knum_(num)
{
cout << "object"<<num_<<"...."<<endl;
}
~Object()
{
cout<<"~object"<<num_<<"....."<<endl;
}
void DisplayKnum()
{
cout<<"knum = "<<knum_<<endl;
}
private:
int num_;
int knum_;
};
int main()
{
Object t;
t.DisplayKnum();
}
五、拷贝
#include<iostream>
using namespace std;
class Object
{
public:
enum Result
{
success = 1,
fail = -1
};
Object(int num = 0):num_(num),knum_(num)
{
cout << "object"<<num_<<"...."<<endl;
}
~Object()
{
cout<<"~object"<<num_<<"....."<<endl;
}
void DisplayKnum()
{
cout<<"knum = "<<knum_<<endl;
}
private:
int num_;
int knum_;
};
int main()
{
Object t;
t.DisplayKnum();
cout<<Object::success<<endl;
}
六、拷贝构造函数
功能:使用一个已经存在的对象来初始化一个新的同类型的对象
声明:只有一个参数并且该参数为该类对象的引用
如果类中没有说明拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员。
格式:Test(const Test& other)
代码例程: