在类的实例进入其作用域时,也就是建立一个对象,构造函数就会被调用,那么构造函数的作用是什么呢?当建立一个对象时,常常需要做某些初始化的工作,例如对数据成员进行赋值设置类的属性,而这些操作刚好放在构造函数中完成。
类的构造方法如下:
class Person { public: Person(); //构造函数 int index; int getIndex(); }; Persn::Person() { index = 10; }
Person()是默认构造函数,如果不显式地写上函数的声明也可以。
构造函数是可以有参数的,修改上面的代码,使其构造函数带有参数。例如:
class Person { public: Person(int Index); //构造函数 int index; int setIndex(int Index); }; Person::Person(int Index) { index = Index; }
下面来个例子:
#include<iostream> using namespace std; class Person { public: Person(); Person(int iIndex,short m_shAge,double m_dSalary); int m_iIndex; short m_shAge; double m_dSalary; int getIndex(); short getAge(); double getSalary(); }; Person::Person() { m_iIndex = 0; m_shAge = 10; m_dSalary = 100; } Person::Person(int iIndex,short m_shAge,double m_dSalary) { m_iIndex = iIndex; m_shAge = m_shAge; m_dSalary = m_dSalary; } int Person::getIndex() { return m_iIndex; } int main() { Person p1; cout << "m_iIndex is:" << p1.getIndex() << endl; Person p2(1,20,1000); cout << "m_iIndex is:" << p2.getIndex() << endl; return 0; }
结果:
程序声明了两个对象p1和p2,p1使用默认构造函数初始化成员变量,p2使用带参数的构造函数初始化,所以在调用同一个类成员函数getIndex时输出结果不同。
构造函数和析构函数是类体定义中比较特殊的两个成员函数,因为他们两个都没有返回值,而且构造函数名标识符和类名标识符相同,而析构函数名标识符就是在类名标识符前面加上“~”符号。
构造函数主要是用来在对象创建时,给对象中的一些数据成员赋值,主要目的就是用来初始化对象。析构函数的功能是用来释放一个对象,在对象删除前,用它来做一些清理的工作,它与构造函数的功能正好相反。
代码:
#include<iostream> #include<string.h> using namespace std; class Person { public: Person(); ~Person(); char *m_pMessage; void showStartMessage(); void showFrameMessage(); }; Person::Person() { m_pMessage = new char[100]; } void Person::showStartMessage() { strcpy(m_pMessage,"I'm Johnson666"); cout << m_pMessage << endl; } void Person::showFrameMessage() { strcpy(m_pMessage,"**************"); cout << m_pMessage <<endl; } Person::~Person() { delete[] m_pMessage; } int main() { Person p1; p1.showFrameMessage(); p1.showStartMessage(); p1.showFrameMessage(); return 0; }
结果:
程序在构造函数中使用new为成员m_pMessage分配空间,在析构函数中使用delete释放由new分配的空间。成员m_pMessage为字符指针,在showStartMessage成员函数中输出字符指针所指向的内容。
使用析构函数的注意事项:
1.一个类中只可能定义一个析构函数。
2.析构函数不能重载。
3.构造函数和析构函数不能使用return语句返回值。不用加上关键字void,加上反而会报错。
构造函数和析构函数的调用环境:
1.自动变量的作用域是某个模块,当此模块被激活时,自动变量调用构造函数,当退出此模块时,会调用析构函数。
2.全局变量在进入main函数之前会调用构造函数,在程序终止时会调用析构函数。
3.动态分配的对象在使用new为对象分配内存时会调用构造函数;使用delete删除对象时会调用析构函数。
4.临时变量是为支持计算,由编译器自动产生的。临时变量的生存期的开始和结尾会调用构造函数和析构函数。