1.构造函数的作用
在创建对象时,编译器会自动调用构造函数,初始化成员变量。
2.定义
- 构造函数名是类名;
- 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
- 函数体中不能有 return 语句。
#include <iostream> using namespace std; class Date { public: Date(){};//定义默认构造函数 void setDate(int y,int m,int d) { m_year=y;m_month=m;m_day=d; }; void showDate(){ cout<<"year:"<<m_year<<", mouth:"<<m_month<<", day:"<<m_day<<endl;//可以访问类中数据成员 }; private: int m_year; int m_month; public: int m_day; };
3.构造函数重载
和普通成员函数一样,构造函数是允许重载的。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数。
构造函数的调用是强制性的,一旦在类中定义了构造函数,那么创建对象时就一定要调用,不调用是错误的。如果有多个重载的构造函数,那么创建对象时提供的实参必须和其中的一个构造函数匹配;反过来说,创建对象时只有一个构造函数会被调用。
如下示例有两种构造函数:
#include <iostream> using namespace std; class Date { public: Date(){ m_year=0;m_month=0;m_day=0; };//定义构造函数 Date(int y,int m,int d) { m_year=y;m_month=m;m_day=d; }; void setDate(int y,int m,int d) { m_year=y;m_month=m;m_day=d; }; void showDate(){ cout<<"year:"<<m_year<<", mouth:"<<m_month<<", day:"<<m_day<<endl;//可以访问类中数据成员 }; private: int m_year; int m_month; int m_day; }; int main(){ Date date1;//调用第一种构造函数 Date date2(2020,2,11);//调用第二种构造函数 date1.setDate(2020,2,10);//访问对象的成员函数 date1.showDate();//year:2020, mouth:2, day:10 date2.showDate();//year:2020, mouth:2, day:11 return 0; }
4.默认构造函数
如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作。比如上面的 Date 类,默认生成的构造函数如下:
Date(){};
注意:
- 一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。
- 一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。
- 调用没有参数的构造函数也可以省略括号。
对于上面Date的例子,在栈上创建对象可以写作Date date()
或Date date
,在堆上创建对象可以写作Date *date= new Date()
或Date *date = new Date
,它们都会调用构造函数Date()。