【发布时间】: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