gpt4 book ai didi

c++ - 不复制 char 数组,函数 swap 不能正确编译并且 stringPtr 没有被修改

转载 作者:行者123 更新时间:2023-11-28 01:12:40 24 4
gpt4 key购买 nike

//在头文件中:类定义:

class myString
{
public:

myString(void);
myString(const char *str);

myString(const myString &); //copy constructor
~myString(void); //destructor

void swap(myString &from);


private:

char *stringPtr;
int stringLen;
};

//在cpp文件中定义成员函数

myString::myString(const char *str)
{
stringLen = strlen(str);

stringPtr = new char[stringLen+1];

strcpy(stringPtr,str);
cout << "constructor with parameter called"<<endl;
}

myString::myString(const myString &str)
{

stringPtr = new char[str.stringLen +1];
strcpy(stringPtr,str.stringPtr);
cout << "copyconstructor"<<endl;
}


void myString::swap(myString &from)
{
myString buffer(from);
int lengthBuffer = from.stringLen;

from = new char[stringLen+1];
from.stringLen = stringLen;
strcpy(from.stringPtr, stringPtr);


stringPtr = new char[lengthBuffer+1];
stringLen = lengthBuffer;
strcpy(stringPtr,buffer.stringPtr);
}

最佳答案

您不能修改引用。即使用指针替换它,修改指针也不会修改指向的对象。相反,您需要处理引用 - 只需交换字段。

void myString::swap(myString &from)
{
std::swap( stringLen, from.stringLen );
std::swap( stringPtr, from.stringPtr );
}

以上是按照 user sbi 的建议使用 std::swap()在评论中。这完全等同于以下内容(仅供说明,不要重新发明 STL):

void myString::swap(myString &from)
// First remember own length and pointer
const int myOldLen = stringLen;
char* myOldPtr = stringPtr;
// now copy the length and pointer from that other string
stringLen = from.stringLen;
stringPtr = from.stringPtr;
// copy remembered length and pointer to that other string
from.StringLen = myOldLen;
from.StringPtr = myOldPtr;
// done swapping
}

即使调用自交换,两者也能正常工作:

myString string;
string.swap( string );

关于c++ - 不复制 char 数组,函数 swap 不能正确编译并且 stringPtr 没有被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1605312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com