这篇文章主要内容是构造函数的初始化列表以及运算符重载在顺序表中的简单应用,运算符重载实现自定义类型的流插入流提取。希望对大家有所帮助,点赞+收藏+评论,支持一下吧!
构造函数进阶理解
在上一篇文章中,我们已经了解过构造函数的作用:初始化对象。
注意,构造函数仅仅说是初始化对象,那么在初始化前一定有为对象分配内存空间,即成员变量的定义。什么时候完成成员变量的定义呢?那就是构造函数内部的初始化列表。
下面给出初始化列表的语法规则:
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。初始化列表是成员变量定义(分配内存空间)的地方,包括自定义类型,内置类型成员。
1. class A//类A 2. { 3. public: 4. A() 5. { 6. cout<<"调用A的默认构造 A()"<<endl; 7. _a=i; 8. } 9. A(int i) 10. { 11. cout << "调用A的带参构造 A(int)" << endl; 12. _a = i; 13. } 14. private: 15. int _a; 16. }; 17. class Date//类Date 18. { 19. public: 20. Date(int year = 1, int month = 1, int day = 1)//构造函数 21. :_year(year),//构造函数的初始化列表(为成员变量分配空间) 22. _month(month), 23. _day(day), 24. a() 25. { 26. //构造函数函数体 27. } 28. private: 29. //成员变量的声明 30. int _year;//内置类型成员 31. int _month; 32. int _day; 33. A a;//自定义类型成员 34. };
初始化列表是构造函数不可缺少的,就算不手动写编译器也会默认添加。默认添加的初始化列表为内置类型分配空间,但不指定值(随机值)。对自定义类型成员会调用自定义类型的默认构造函数。
1. public: 2. Date(int year = 1, int month = 1, int day = 1)//构造函数 3. /*:_year(), //编译器默认添加,会为成员分配内存空间,是随机值 4. _month(), 5. _day(), 6. a()*/ //对自定义类型会调用自定义类型的默认构造函数 7. { 8. 9. }
1.内置类型成员在参数列表中的定义
此时上面的构造函数未手动添加初始化列表,这时创建一个对象
1. Date d1; 2. d1.Print();
打印d1的内置类型成员变量。
是随机值,因为默认初始化列表只为内置类型成员变量分配了内存空间,并没有给成员变量赋值。
此时赋值操作既可以在手动添加的初始化列表中完成,也可以在函数体中完成赋值。
(1).手动添加的初始化列表中完成赋值
1. Date(int year = 1, int month = 1, int day = 1)//构造函数 2. :_year(year), 3. _month(month), 4. _day(day) 5. { 6. 7. }
1. Date d1; 2. d1.Print();
运行结果:
(2).函数体内完成赋值
1. public: 2. Date(int year = 1, int month = 1, int day = 1)//构造函数 3. /* :_year(), 4. _month(), 5. _day()*/ //默认参数列表 6. { 7. _year = year; 8. _month = month; 9. _day = day; 10. }
1. Date d1; 2. d1.Print();
运行结果:
总结:内置类型成员变量的定义(分配内存空间)只能在初始化列表中一次性完成,不管写不写都会有这个过程,手动写可以顺便在定义时赋值。不写编译器的默认参数列表会将成员变量定义为随机值,之后再函数体中再次赋想要的值。
2.自定义类型成员在参数列表中的定义
当我们不手动添加初始化列表,默认的初始化列表会调用自定义类型成员的默认构造函数
例如:当构造函数是这样时
1. Date(int year = 1, int month = 1, int day = 1)//构造函数 2. //:_year(),//默认初始化列表 3. //_month(), 4. //_day(), 5. //a() 默认构造函数的调用 6. { 7. //构造函数函数体 8. }
Date d1;
运行结果:
当我们手动写初始化列表时,就可以选择性的调用自定义类型的构造函数,可以是带参的,也可以是默认构造函数。
1. Date(int year = 1, int month = 1, int day = 1)//构造函数 2. :_year(year),//默认初始化列表 3. _month(month), 4. _day(day), 5. a(2) //选择调用带参构造函数
此时
Date d1;
运行结果
总结:默认构造函数对自定义类型自动调用自定义类型的默认构造方法本质是默认构造函数的默认初始化列表调用自定义类型的默认构造方法。只要构造方法使用默认初始化列表,对自定义类型就会调用它的默认构造方法。反之,手动添加初始化列表就可以选择性的调用自定义类型的构造方法。