• 97.重载类的+法与深拷贝构造(拷贝构造深拷贝,赋值深拷贝)


     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <iostream>
     3 #include <locale.h>
     4 using namespace std;
     5 
     6 //返回值为类的引用不会调用拷贝构造
     7 //拷贝构造要深拷贝,赋值重载(=)也要深拷贝
     8 //注意对象如果是在栈上,有生命周期,拷贝栈上的对象需要深拷贝
     9 
    10 class mystring
    11 {
    12 public:
    13     char *p;
    14     int n;
    15 
    16 public:
    17     mystring() : p(nullptr), n(0)
    18     {
    19 
    20     }
    21     mystring(char *str)
    22     {
    23         p = new char[strlen(str) + 1];
    24         n = strlen(str) + 1;
    25         strcpy(p, str);
    26     }
    27 
    28     mystring(const mystring &my)
    29     {
    30         n = my.n;
    31         p = new char[n];
    32         strcpy(p, my.p);
    33     }
    34 
    35     ~mystring()
    36     {
    37         delete p;
    38     }
    39 
    40     //void operator +(mystring &str)
    41     //{
    42     //    this->n += strlen(str.p);
    43     //    //分配内存
    44     //    char *ptemp = new char[this->n];
    45     //    //拷贝
    46     //    strcpy(ptemp, this->p);
    47     //    strcat(ptemp, str.p);
    48     //    delete this->p;
    49     //    this->p = ptemp;
    50     //}
    51 
    52     //返回一个对象
    53     //mystring operator +(mystring &str)
    54     //{
    55     //    this->n += strlen(str.p);
    56     //    //分配内存
    57     //    char *ptemp = new char[this->n];
    58     //    //拷贝
    59     //    strcpy(ptemp, this->p);
    60     //    strcat(ptemp, str.p);
    61     //    delete this->p;
    62     //    this->p = ptemp;
    63 
    64     //    return (*this);
    65     //}
    66 
    67     //如果返回的是引用则不会调用拷贝构造
    68     mystring &operator +(mystring &str)
    69     {
    70         this->n += strlen(str.p);
    71         //分配内存
    72         char *ptemp = new char[this->n];
    73         //拷贝
    74         strcpy(ptemp, this->p);
    75         strcat(ptemp, str.p);
    76         delete this->p;
    77         this->p = ptemp;
    78 
    79         return (*this);
    80     }
    81 };
    82 
    83 void main()
    84 {
    85     mystring *my1 = new mystring("hello");
    86     mystring *my2 = new mystring("world");
    87     mystring my3 = *my1 + *my2;
    88     delete my1;
    89     cout << my3.p << endl;
    90     cin.get();
    91 }
  • 相关阅读:
    js数字格式化(加千分位逗号)
    [css]解决iframe在ios设备上无法滚动
    判断当前是否在微信浏览器环境
    TortoiseGit 提交代码每次需要输入用户名和密码?
    如何编写jQuery插件
    函数作用域
    HTTP动词
    如何减少全局变量污染?
    mysql表大字段最大长度限制设置
    update left join 多表关联更新
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8598175.html
Copyright © 2020-2023  润新知