c++ 构造函数

构造函数是c++类中六个默认成员函数中的一个,主要负责完成初始化工作

1.概念:
构造函数是C++类中一个特殊的成员函数,名字与类名相同,创建类类型对象时编译器自动调用,保证每个数据成员都有一个初始值,并且在对象的生命周期内只调用一次

?2.特性:

  • 函数名与类名相同
  • 无返回值
  • 对象实例化时编译器自动调用对应的构造函数
  • 构造函数可以重载

构造函数分为无参构造和带参构造函数(构造函数的重载)

通过无参构造函数创建一个对象时,函数后边不用跟括号,否则就成了函数声明

class Date{
public:
    Date(){}//无参构造函数

    Date(int year,int month,int day){
        //带参构造函数
        _year = year;
        _month = month;
        _day = day;
    }
private:
    int _year;
    int _day;
    int _month;
};

int main(){
    Date d1;    //调用无参构造函数
    Date d2(2019,9,4);  //调用带参构造函数

    Date d3();  //成为了函数声明
    return 0;
}

  • 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
class Date{
public:
//    Date(){}//无参构造函数
//
//    Date(int year,int month,int day){
//        //带参构造函数
//        _year = year;
//        _month = month;
//        _day = day;
//    }
private:
    int _year;
    int _day;
    int _month;
};

int main(){
    //没有定义构造函数,对象也可以创建成功,因此此处调用的是系统默认生存的构造函数
    Date d1;

    return 0;
}
  • 无参构造函数和全缺省构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写系统默认生成的构造函数都可以称为默认构造函数
class Date{
public:
    Date() {
        _year = 2019 ;
        _month = 9;
        _day = 4;
    }
    Date (int year = 2019, int month = 9, int day = 4){
        _year = year;
        _month = month;
        _day = day;
    }
private:
    int _year ;
    int _month ;
    int _day ; };
// 以下测试函数能通过编译吗?
void Test(){
    Date d1;
    //不能编译通过
}
  • 关于编译器生成的默认成员函数,很多童鞋会有疑惑:在我们不实现构造函数的情况下,编译器会生成 默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象year/month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么卵 用??
    解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如 int/char…,自定义类型就是我们使用class/struct/union自己定义的类型,看看下面的程序,就会发现 编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数
class Time{
public:
    Time() {
        cout << "Time()" << endl;
        _hour = 0;
        _minute = 0;
        _second = 0;
    }
private:
    int _hour;
    int _minute;
    int _second;
};
class Date{
private:
    // 基本类型(内置类型) int _year;
    int _month;
    int _day;
    // 自定义类型
    Time _t;

};
int main() {
    Date d;
    return 0;
}

  • 成员变量的命名风格
// 我们看看这个函数,是不是很僵硬?
class Date{
public:
    Date(int year){
        // 这里的year到底是成员变量,还是函数形参?
        year = year;
    }
private:
    int year;
};
// 所以我们一般都建议这样
class Year{
public:
    Year(int year){
        _year = year;
    }
private:
    int _year;
};

// 或者这样。
class Day{
public:
    Day(int day){
        m_day = day;
    }
private:
    int m_day;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值