#includeusing namespace std; class Date { public: Date(int year = 1999, int month = 1, int day = 1)//构造函数 { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1;//Date d1()这样写必须要给参数不然报错 Date d1;//多次会报错,重定义 return 0; }
构造函数有四种,全缺省构造函数,无参构造函数,半缺省构造函数,默认构造函数,上面的Date就是全缺省构造函数
半缺省构造函数使用时记得传参
#includeusing namespace std; class Date { public: Date(int year, int month = 1, int day = 1)//半缺省构造函数 { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1(1900);//不传参会报错,不要写成Date d1(); return 0; }
无参构造函数
#includeusing namespace std; class Date { public: Date()//无参构造函数 { _year = 1; _month = 1; _day = 1; } //也可以什么都不给 Date()//无参构造函数,打印出结果为随机值 {} private: int _year; int _month; int _day; }; int main() { Date d1;// d1.print(); return 0; }
全缺省构造函数
#includeusing namespace std; class Date { public: Date(int year = 1900, int month = 1, int day = 1)//半缺省构造函数 { _year = year; _month = month; _day = day; } //不可再写 Date() { } private: int _year; int _month; int _day; }; int main() { Date d1;//注意有了全缺省构造函数,不能再写无参构造函数,系统不知道调用哪一个 return 0; }
默认构造函数
如果我们自己没有写任何构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
#includeusing namespace std; class Date { public: void print() { cout<<_year<<" "<<_month<<" "<<_day< 我们运行上述程序发现,编译器生成的默认构造函数好像没有什么用
原因
C++ 把类型分成 内置类型(基本类型) 和 自定义类型 。 内置类型就是语言提供的数据类型,如:int/char...; 自定义类型就是我们使用 class/struct/union 等自己定义的类型。 其中 默认生成的构造函数,内置类型成员( 任何指针都属于内置类型)不做处理,自定义类型成员回去调用他的默认构造函数。 那我们是否可以在私有中给变量赋值,不让它为随机值?#includeusing namespace std; class Date { public: void print() { cout<<_year<<" "<<_month<<" "<<_day< 答案是可以的
但是需要说明的是这里并不是对变量进行初始化,而是给的缺省值
简单总结一下:
默认构造函数 1 、我们不写,编译器自动生成(不处理内置类型),自定义类型调用自己的默认构造函数 2 、我们自己写全缺省构造函数,一般不使用半缺省构造函数,防止忘记赋值产生错误 3 、我们自己写无参构造函数,不能和全缺省构造函数共存,只有有一个



