下面的代码示例,如果来自“C ++ von A bis Z”(第二版,翻译:C ++从A到Z),请参阅第364页。样本错误。
// overload operator +=
#include <iostream>
#include <cstring>
using namespace std;
class String {
private:
char* buffer;
unsigned int len;
public:
String(const char* s="") {
// cout << "Constructor: " << s << "\n";
len = strlen(s);
buffer = new char [len+1];
strcpy(buffer, s);
}
~String() {
// cout << "Destructor: " << buffer << "\n";
delete [] buffer;
}
String(const String& s) {
// cout << "Copy_Constructor: " << s.get_buffer() << "\n";
len = s.len;
buffer = new char [len+1];
strcpy(buffer, s.buffer);
}
char* get_buffer() const {
return buffer;
}
// returning a reference is more efficent
// String& operater+=(const String& str1)
String operator+=(const String& str1) {
// cout << "Assignment_Operator +=: " << str1.get_buffer() << "\n";
String tmp(*this);
delete [] buffer;
len = tmp.len + str1.len;
// invalid pointer
// buffer = new char[len+1];
buffer = new char [len]+1;
strcpy(buffer, tmp.buffer);
strcat(buffer, str1.buffer);
// wrong return_type
// return *this;
return buffer;
}
};
int main(void) {
String string1("Adam");
String string2("Eva");
string1+=" und ";
string1.operator+=(string2);
cout << string1.get_buffer() << "\n";
return 0;
}
带有评论的行是我的“修正”。现在我想知道“新char [len] +1”的作用是什么?我想以下几点:
会发生什么? 感谢
//编辑 谢谢你们!你帮了我! 我只是想知道,这句话将会回归。
new char [len]+1;
该行本身当然是本书作者的错字。
答案 0 :(得分:4)
让我们分解一下:
new char[len];
返回指向char
数组的指针。
new char[len] + 1;
返回内存中的下一个地址。
它基本上切断了第一个角色。
编辑:正如其他人所提到的,这很可能是一个错字,它应该是new char[len+1]
。我只是解释代码的作用,但如果你真的知道你在做什么,你应该只使用指针算术。 cHao指出,试图删除返回的指针将是UB。如果len == 1
,您还将获得UB并尝试使用返回的指针。
答案 1 :(得分:1)
如果向i
添加整数T*
,则会向指针添加sizeof(T) * i
。因此,在这种情况下,由于new char[len]
返回char*
,+ 1
确实会向其添加sizeof(char) * 1
。
答案 2 :(得分:0)
new Type[size] + 1
将分配一个大小为size
的数组,并生成索引为1的元素的地址 - 即第二个元素。没什么特别的,只是指针算法。 new[]
将生成索引为0的元素的地址,并且在该地址上执行大小+1
,它将生成索引为1
的元素的地址。
答案 3 :(得分:0)
它只返回指向 second 数组项=)的指针 阅读C指针;)
答案 4 :(得分:0)
+sizeof(char)*1
,但我没听清你为什么要这样做。
答案 5 :(得分:0)
我认为这是一个错字,它应该是new char [len+1]
。 +1
用于必须存在的字符串终止符。