【问题标题】:deep copying using copy constructor c++使用复制构造函数 C++ 进行深度复制
【发布时间】:2016-11-02 15:49:36
【问题描述】:

我正在尝试实现我自己的 CString 类。我在浅拷贝指针时遇到了一些问题。 这里是课堂

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

class myCString{
public:
    myCString(){
        m_value = NULL;
    }
    myCString(char* strParam){
        int len = length(strParam);
        m_value = new char[len+1];
        for(int i=0;i<len; i++)
        {
            m_value[i] = strParam[i];
        }
        m_value[len]='\0';

    }
    myCString(const myCString& obj)
    {
        int len = obj.length();
        m_value = new char[len+1];
        for(int i=0;i<len; i++)
        {
            m_value[i] = obj.m_value[i];
        }
        m_value[len]='\0';
    }
        myCString(const myCString *obj)
    {
        int len = obj->length();
        m_value = new char[len+1];
        for(int i=0;i<len; i++)
        {
            m_value[i] = obj->m_value[i];
        }
        m_value[len]='\0';
    }
     const int length() const
    {
        return length(m_value);
    }
    myCString operator=(myCString obj)
    {
        int i=0;
        int length= obj.length();
        m_value = new char[length + 1];
        for(;i<obj.length(); i++)
        {
            m_value[i] = obj.m_value[i];
        }
        m_value[length]='\0';
        return m_value;
    }

    ~myCString()
    {
        delete []m_value;
        m_value = NULL;
    }
    friend ostream& operator<<(ostream& os, const myCString obj);
private:
    const int length(char* strParam)const
    {
        int i=0;
        while(strParam[i]!='\0'){
        i++;
        }
        return i;
    }
    char *m_value;
};
ostream& operator<<(ostream& os, myCString obj)
    {
        os<<obj.m_value;
        return os;
    }

这里是main():

#include"myCString.h"
int main()
{
    myCString *ptr = new myCString("Hi! This is myCString\n");
    cout<<*ptr;
    myCString *ptr2 = ptr;
    delete ptr;
    cout<<*ptr2;
    delete ptr2;
    return 0;
}

问题是何时发生浅拷贝;我知道写作

myCString *ptr2 = new myCString(ptr); 

将解决问题;但我想保持主要功能完好无损并在课堂上进行一些更改。 反正我能做到吗? 提前致谢。

【问题讨论】:

  • 怎么样?您将指针指向与ptr 相同的对象。这里没有复制发生
  • myCString *ptr2 = ptr; 调用 myCString* 而不是 myCString 类型的副本,因此不会调用您的构造函数。如果您只写了myCString obj2 = ptr;new myCString(ptr),则使用myCString 的复制ctor。还允许从指针复制几乎没有意义,只会增加混乱。
  • 是的,有一种方法,分配内存...语法T *a = b; 将始终复制一个指针(T* 类型),而不是它的指针。
  • 好吧...我的错... :) 我想问的是;有没有办法让这两个指针变得独立,这样即使我删除了第一个,第二个仍然可以使用,而无需更改 main() 中的代码?
  • 还有一件事,如果我重载 = 运算符怎么办?我也尝试过这样做,但这没有帮助。谁能解释一下为什么?

标签: c++ deep-copy shallow-copy


【解决方案1】:

您的请求是对myCString *ptr2 = ptr 行中的对象进行深层复制, 但是这个目标是对象的类编程无法达到的,因为这一行只复制了一个指针,不涉及对象的类。 如果您想调用复制构造函数,您必须按照您的建议编写: myCString *ptr2 = new myCString(ptr); 或者你可以写:

myCString mystr("Hi! This is myCString\n");
cout<<mystr;
myCString mystr2 =mystr;
cout<<mystr;

另一个问题:调用函数ostream&amp; operator&lt;&lt;(ostream&amp; os, myCString obj) 为参数 obj 调用复制运算符 myCString(const myCString&amp; obj)。你应该写

ostream& operator<<(ostream& os, const myCString& obj)

为了避免这种情况。

【讨论】:

    【解决方案2】:

    改变你的 myCString(char* strParam)签名给

    myCString(const char* strParam)

    【讨论】:

    • 感谢您的建议;但这不会解决这个问题吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多