【发布时间】:2018-12-25 11:02:01
【问题描述】:
19.3 节在主要关注运算符重载的章节中介绍了字符串表示,特别是特殊运算符[]、-> 和()。它将copy_from()作为辅助函数实现如下:
void String::copy_from(const String &x)
// make *this a copy of x
{
if (x.sz <= short_max)
{
memcpy(this, &x, sizeof(x);
ptr = ch;
}
else
{
ptr = expand(x.ptr, x.sz+1);
sz = x.sz;
space = 0;
}
}
类界面如下所示:
#ifndef STRING_EXERCISE_H
#define STRING_EXERCISE_H
namespace simple_string
{
class String;
char *expand(const char *ptr, int n);
}
class String
{
public:
String(); // default constructor x{""}
explicit String(const char *p); // constructor from C-style string
String(const String &s); // copy constructor
String &operator=(const String& s); // copy assignment
String(String &&s) // move constructor
String &operator=(String &&s) // move assignement
~String() // destructor
char &operator[](int n); // unchecked element access
char operator[](int n) const;
char &at(int n); // checked element access
char at(int n) const;
String &operator+=(char c) // add char c to the end
const char *c_str(); // c-style string access
const char *c_str() const;
int size() const; // number of elements
int capacity() const; // elements plus available space
private:
static const short short_max = 15;
int sz;
char *ptr;
union
{
int space; // unused allocated space
char ch[short_max+1]; // leave space for terminating 0
};
void check(int n) const; // range check
void copy_from(const String &x);
void move_from(String &x);
}
#endif
String::copy_from()如何使用memcpy()复制类?我认为复制的类必须是可简单复制的(事实并非如此,因为String 具有用户定义的构造函数、复制操作、移动操作和析构函数)。
【问题讨论】:
-
复制的类与复制到的类完全相同。您可以在自己的课程中利用实施知识
-
如果对象不是 TriviallyCopyable,则 memcpy 的行为未指定并且可能未定义。 在这种情况下应该没问题,因为作者会负责复制的内容错误。
-
@NathanOliver 不就是outright undefined,不管上课内容吗?
-
对不起@Joe,你能详细说明一下吗?我不明白这将如何改变标准说它未定义为
memcpy()非平凡可复制类型这一事实。 -
@NathanOliver 如果“作者处理了错误复制的内容”是否意味着此代码无效?
标签: c++