2、构造函数的分类及调用.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //4.2.2 构造函数的分类及调用
  2. //两种分类方式:
  3. //按参数分为:有参构造和无参构造
  4. //按类型分类:普通构造和拷贝构造
  5. //三种调用方式
  6. //括号法
  7. //显示法
  8. //隐式转换法
  9. //示例
  10. //1、构造函数分类
  11. //按照参数分类分为 有参和无参构造 无参(默认构造)又称为默认构造函数
  12. //按照类型分类分为 普通构造和拷贝构造
  13. #if(0)
  14. #include <iostream>
  15. class Person
  16. {
  17. public:
  18. //构造函数
  19. Person()
  20. {
  21. std::cout << "Person的无参构造函数调用" << std::endl;
  22. }
  23. Person(int a)
  24. {
  25. age = a;
  26. std::cout << "Person的有参构造函数调用" << std::endl;
  27. }
  28. //拷贝构造函数
  29. Person(const Person& p)
  30. {
  31. //将传入的人身上的所有属性拷贝到我身上
  32. age = p.age;
  33. }
  34. //析构函数
  35. ~Person()
  36. {
  37. std::cout << "Person的析构函数调用" << std::endl;
  38. }
  39. int age;
  40. };
  41. //调用
  42. void test01()
  43. {
  44. //1、括号法:
  45. //Person p1; //默认构造函数调用
  46. //Person p2(10); //有参构造函数
  47. //Person p3(p2); //拷贝构造函数
  48. //注意事项:
  49. //调用默认无参的构造函数时不要加()
  50. //Person p1() 编译器会认为是一个函数的声明,不会认为在创建对象
  51. Person p1();
  52. //std::cout << "p2的年龄为:" << p2.age << std::endl;
  53. //std::cout << "p3的年龄为:" << p3.age << std::endl;
  54. //2、显示法:
  55. Person p1;
  56. Person p2 = Person(10); //会调用有参构造
  57. Person p3 = Person(p2); //拷贝法构造
  58. Person(10); //匿名对象 特点 :当前执行结束后,系统会立即回收掉匿名对象
  59. //注意事项 :
  60. Person(p3); //对向声明
  61. //不要利用拷贝构造函数 初始化匿名函数对象 编译器会认为Person(p3) === Person p3;
  62. //3、隐式转换法:
  63. Person p4 = 10; //相当于 写了 Person p4 = Person(10); 有参构造
  64. }
  65. int main()
  66. {
  67. test01();
  68. system("pause");
  69. return 0;
  70. }
  71. #endif