C++——构造函数是开空间创建对象还是初始化对象?

it2023-08-10  74

1、构造函数的概念

有如下代码:

class Date { public: void SetDate(int year, int month, int day) { _year = year; _month = month; _day = day; } void PrintDate() { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; void test() { Date d; d.SetDate(2020, 10, 18); d.PrintDate(); } int main() { test(); system("pause"); return 0; }

对于Date类,可以通过SetDate函数给对象设置内容,但是每次创建对象都调用会很麻烦,则有了构造函数

构造函数一个特殊的成员函数,名字与类名相同,无返回值,创建类类型对象时由编译器自动调用,在对象的生命周期内只使用一次

注意:构造函数并不是开空间创建对象,而是初始化对象

简单构造函数举例:

2、构造函数可以重载

d1调用无参构造函数,d2调用带参数构造函数

注意:通过无参构造函数创建对象时,对象后面不用跟括号,否则就是一个函数声明

3、如果类中没有显式定义构造函数,C++编译器会自动生成一个无参的默认构造函数

此处调用编译器自动生成的默认构造函数

此处显式定义了带参构造函数,编译器则不再生成默认无参构造函数,此时没有与定义的类d相匹配的构造函数,则会出现错误

此处调用的是显式定义出来的构造函数

问:在没有显式定义构造函数的情况下,编译器会生成默认的构造函数,默认构造函数有什么用?

答:C++把类型分成内置类型和自定义类型,有如下代码,编译器生成默认的构造函数会对自定义类型成员_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; } ​

 

4、无参的构造函数和全缺省的构造函数都称为默认构造函数,默认构造函数只能有一个

注意:无参构造函数、全缺省构造函数、编译器默认生成的构造函数都可以认为的默认成员函数

最新回复(0)