• C++ 构造函数,拷贝构造


    1. 构造函数和析构函数
      1. 构造函数:对象创建时调用构造函数,构造函数是初始化对象的属性
      2. 析构函数:对象在销毁前调用析构函数,析构函数做清理工作
      3. 构造函数分类:无参构造,有参构造,拷贝构造
      4. 编译器给类提供了什么函数:默认构造函数(无参),默认拷贝构造,析构函数,默认的赋值函数
      5. 如果自己提供了构造函数,那么编译器不会提供默认的构造函数,但是会提供默认的拷贝构造函数
      6. 如果自己提供了拷贝构造函数,那么编译器不会提供任何默认构造函数
      7. 构造函数,没有返回值,没有void
      8. 析构函数不能重载,没有参数,没有返回值,没有void
    2. 匿名对象
      1. 没有名字的对象,他的生命周期在当前行
      2. 当前面有Copy copy; 后面不就能这样写Copy(copy)
    3. 调用拷贝构造函数的时机
      1. 一个对象去初始化另一个对象时
      2. 对象做函数参数时
      3. 看编译器:返回局部对象时,有的调用,有的不调用
    4. 多个对象的构造函数调用顺序
      1. 先调用成员对象,成员对象的调用顺序看定义前后,最后调用本身的构造函数
      2. 析构函数调用的顺序和构造函数相反
      3. 为什么要写初始化列表:当成员对象没有默认构造时,我们要调用其他构造函数是,需要显示的调用,这时要写初始化列表
    5. 深浅拷贝
      1. 如果类内有指针,并且该指针指向申请的堆空间,这时只使用默认的拷贝构造函数,那么会出现浅拷贝问题,(一块空间在析构函数中被释放两次)
      2. 深拷贝:自己写的拷贝构造函数,申请一块空间,把旧空间的数据拷贝到新空间

    拷贝构造调用时机 

    1. class Maker
    2. {
    3. public:
    4. Maker()
    5. {
    6. cout << "无参构造函数" << endl;
    7. }
    8. Maker(int a)
    9. {
    10. cout << "有参构造函数" << endl;
    11. }
    12. Maker(const Maker &maker)
    13. {
    14. cout << "拷贝构造函数" << endl;
    15. }
    16. ~Maker()
    17. {
    18. cout << "析构函数" << endl;
    19. }
    20. };
    21. // 1.对象以值方式给函数参数
    22. void func(Maker m)//Maker m=m1;
    23. {
    24. }
    25. void test01()
    26. {
    27. Maker m1;
    28. func(m1);
    29. ​​​​​​​}
    30. //2.用一个已有的对象去初始化另一个对象
    31. void test02()
    32. {
    33. Maker m1;
    34. Maker m2(m1);
    35. }
    36. //3.函数的局部对象以值的方式从函数返回,vs Debug(调试)模式下,会调用拷贝构造,vs Release(发行)模式下不会调用拷贝构造,qt也不调用
    37. Maker func2()
    38. {
    39. //局部对象
    40. Maker m;
    41. cout << "局部对象的地址:" << &m << endl;
    42. return m;
    43. }
    44. void test03()
    45. {
    46. Maker m1 = func2();
    47. cout << "m1对象的地址:" << &m1 << endl;
    48. }

     使用指针时的写法:

    1. #include <iostream>
    2. using namespace std;
    3. class Copy {
    4. public:
    5. Copy() {
    6. cout << "no params constructor" << endl;
    7. }
    8. Copy(int a) {
    9. cout << "have params constructor" << endl;
    10. }
    11. Copy(const Copy &co) {
    12. cout << "copy constructor" << endl;
    13. }
    14. Copy(const Copy *co) {
    15. cout << "copy constructor" << endl;
    16. }
    17. ~Copy() {
    18. cout << "deconstructor" << endl;
    19. }
    20. };
    1. #include <iostream>
    2. #include "./copy.cpp"
    3. using namespace std;
    4. void test() {
    5. cout << "------------------------------" << endl;
    6. Copy();
    7. Copy(1);
    8. Copy c1;
    9. Copy c2(1);
    10. Copy c3(c1);
    11. Copy c4 = c1;
    12. Copy c5 = 1;
    13. cout << "------------------------------" << endl;
    14. Copy *c6 = new Copy();
    15. Copy *c7=new Copy(1);
    16. Copy *c8 = new Copy(*c7);
    17. Copy *c9 = new Copy(c7);
    18. }
    19. int main() {
    20. test();
    21. system("pause");
    22. return EXIT_SUCCESS;
    23. }

  • 相关阅读:
    【无锁队列】无锁CAS_无锁队列
    AJAX——案例
    20240701给NanoPi R6C开发板编译友善之臂的Android12系统
    R语言连接 PostgreSQL
    sql事务-1
    Redis:send of 37 bytes failed with errno=10054
    vue3 插值表达式
    精品基于Uniapp+SSM实现的Android平台的健康管理系统
    MyBatis——【第三章】管理关系映射及spring集成
    蓝桥杯嵌入式第12届真题(完成) STM32G431
  • 原文地址:https://blog.csdn.net/qq_35496811/article/details/126432455