C++ 构造函数

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()。

具体内存分配可参照:https://www.cnblogs.com/AntonioSu/p/12273116.html

原文地址:https://www.cnblogs.com/AntonioSu/p/12290571.html