qq_45735316 2020-05-08 11:21 采纳率: 94.1%
浏览 371
已采纳

MyString(const MyString &_str);跟运算符=的重载不是一个意思吗?为什么复制构造函数的定义不能像=重载那样写?

图片说明
//6-24.2classfile.cpp

#include <iostream>
#include <string.h>
#include "6-24.2classfile.h"
using namespace std;
//constructor&destructor
MyString::MyString()
{
    str=new char;//???
    str[0]='\0';
    len=0;   //为什么长度等于0? 
}
MyString::MyString(const char *_str)   //char *_str是一个char数组 
{
    len=strlen(_str);
    str=new char[len+1];
    str[len]='\0';
    strncpy(str,_str,len+1);        //strncpy有三个参数
    // char *strncpy(char *dest, const char *src, size_t n) 
    //把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
    /*当_str长度小于第三个参数n时 ,str的剩余部分将用空字节填充*/ 
}
MyString::MyString(const MyString &_str)
{
    len =_str.len;
    str=new char[len+1];
    str[len]='\0';
    strncpy(str,_str.str,len+1);        //_str.str(_str
    //cout<<str<<endl;
}
void MyString::operator =(const MyString &_str)
{
    str=_str.str;
    len=_str.len;
}
MyString::~MyString(){                  //???
}
//operator
const MyString MyString::operator +(const MyString &_str)
{
    int newLen=len+_str.len;
    char *newStr=new char[newLen+1];
    newStr[newLen]='\0';
    strncpy(newStr,str,len);        //先将str(原字符串)复制到新的字符数组 
    strncat(newStr,_str.str,_str.len);    //在将_str.str将接到newStr后面
    /*char *strncat(char *dest, const char *src, size_t n)
     把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。*/ 
    return MyString(newStr);       //返回一个MyString类对象 
}

//friend
istream & operator >>(istream &_in,MyString &_str)
{
    _in>>_str.str;                      //istream是什么鬼? 输入流 
    _str.len=strlen(_str.str);
    return _in;
}
ostream & operator <<(ostream &_out,MyString &_str)
{
    _out<<_str.str<<endl<<"length:"<<_str.len;  //
    return _out; 
}

//6-24.2classfile.h

#include <iostream>
#include <string>
using namespace std;

class MyString{
    public:
        MyString();
        MyString(const char *_str);
        MyString(const MyString &_str);
        ~MyString();
    public:
        const MyString operator +(const MyString &_str);
        void operator =(const MyString &_str);
        void operator +=(const MyString& _str);
        const char operator [](int i);
    public:
        friend istream & operator >>(istream &_in,MyString &_str);
        friend ostream & operator <<(ostream &_out, MyString &_str); 
    private:
        char *str;
        int len;
};
  • 写回答

2条回答 默认 最新

  • 胖狗子修行之路 2020-05-08 11:38
    关注

    大概因为拷贝构造函数是新建一个对象,而赋值运算符(=)是复制。
    简单的例子,某个类如果需要唯一序列号,调用拷贝构造函数则会生成新的序列号,而调用赋值运算符应该是同一序列号

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?