zoukankan      html  css  js  c++  java
  • 89.赋值重载以及深浅拷贝

    • 非指针,则深浅拷贝都一样,含有指针则内存共享,指针一致,内容一直
    • 深拷贝,指针不一致,内存一直,内存是独享的
    • 赋值重载如果有返回自身类型对象,会调用拷贝构造,需要重载拷贝构造,这一点是必须要注意的,原理是:先操作一个类,再把操作的这个类拷贝到本类中,即使返回(*this),也会调用 (如果返回值是自身类型,赋值重载的this指针是不是本类的this指针!!!!所以需要拷贝构造)

    代码示例:

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <iostream>
     3 using namespace std;
     4 
     5 //非指针,则深浅拷贝都一样,含有指针则内存共享,指针一致,内容一直
     6 //深拷贝,指针不一致,内存一直,内存是独享的
     7 //赋值重载如果有返回自身类型对象,会调用拷贝构造
     8 //原理是:先操作一个类,再把操作的这个类拷贝到本类中,即使返回(*this),也会调用
     9 
    10 class mystring
    11 {
    12 public:
    13     char *p;
    14     int n;
    15     mystring() :p(nullptr), n(0)
    16     {
    17 
    18     }
    19 
    20     mystring(char *str)
    21     {
    22         cout << "构造函数调用" << endl;
    23         n = strlen(str) + 1;
    24         p = new char[n];
    25         strcpy(this->p, str);//拷贝
    26     }
    27 
    28     mystring(const mystring &my)
    29     {
    30         cout << "拷贝构造函数调用" << endl;
    31         cout << (void *)p << endl;
    32         this->n = my.n;
    33         this->p = new char[this->n];
    34         strcpy(this->p, my.p);//拷贝
    35     }
    36 
    37     ////重载=
    38     //void operator =(const mystring &stringmy)
    39     //{
    40     //    delete this->p;
    41     //    cout << "赋值重载调用" << endl;
    42     //    this->n = stringmy.n;
    43     //    this->p = new char[this->n];
    44     //    strcpy(this->p, stringmy.p);
    45     //}
    46 
    47     //使可以多次重载
    48     mystring operator =(const mystring &stringmy)
    49     {
    50         cout << "赋值重载调用" << endl;
    51         delete this->p;
    52         this->n = stringmy.n;
    53         this->p = new char[this->n];
    54         cout << (void *)p << endl;
    55         strcpy(this->p, stringmy.p);
    56         return (*this);
    57     }
    58 
    59     ~mystring()
    60     {
    61         delete this->p;
    62     }
    63 };
    64 
    65 void main()
    66 {
    67     mystring my1("12345");
    68     mystring my2,my3;
    69     //赋值重载
    70     my3 = my2 = my1;
    71     cout << my3.p << endl;
    72     cin.get();
    73 }
  • 相关阅读:
    RocketMQ 概念
    CentOS7使用firewalld管理防火墙
    java应用启动报错Unable to access jarfile xxxxx.jar
    docker启动redis并设置密码
    sql优化整理(二)
    sql优化整理(一)
    dubbo配置的覆盖关系
    dubbo配置加载优先级
    ZooKeeper的数据模型
    leetcode104:permutations
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8596814.html
Copyright © 2011-2022 走看看