Redian新闻
>
这个拷贝构造函数有什么问题?
avatar
这个拷贝构造函数有什么问题?# JobHunting - 待字闺中
m*n
1
MyStr::MyStr(const MyStr& original)
{
p = new char[original.size+1];
memcpy(p, original.data, original.size);
p[original.size] = '\0';
}
char* data;
int size;
谢谢。更新了一下 ,还有问题么?
更新了成员变量。
avatar
w*x
2

p.size??p.data??这个是C++吗, 啥啊

【在 m***n 的大作中提到】
: MyStr::MyStr(const MyStr& original)
: {
: p = new char[original.size+1];
: memcpy(p, original.data, original.size);
: p[original.size] = '\0';
: }
: char* data;
: int size;
: 谢谢。更新了一下 ,还有问题么?
: 更新了成员变量。

avatar
m*n
3
重新写了一下。

【在 w****x 的大作中提到】
:
: p.size??p.data??这个是C++吗, 啥啊

avatar
l*a
4
waht is p?
why not use this->data or data

【在 m***n 的大作中提到】
: MyStr::MyStr(const MyStr& original)
: {
: p = new char[original.size+1];
: memcpy(p, original.data, original.size);
: p[original.size] = '\0';
: }
: char* data;
: int size;
: 谢谢。更新了一下 ,还有问题么?
: 更新了成员变量。

avatar
m*n
5
just assume it is data. what's the problem with the code ?

【在 l*****a 的大作中提到】
: waht is p?
: why not use this->data or data

avatar
R*Z
6
p[original.size+1] = '\0'越界了吧?应该是p[original.size]= '\0'

【在 m***n 的大作中提到】
: MyStr::MyStr(const MyStr& original)
: {
: p = new char[original.size+1];
: memcpy(p, original.data, original.size);
: p[original.size] = '\0';
: }
: char* data;
: int size;
: 谢谢。更新了一下 ,还有问题么?
: 更新了成员变量。

avatar
l*a
7
BTW, p[original.size]='\0';

【在 m***n 的大作中提到】
: MyStr::MyStr(const MyStr& original)
: {
: p = new char[original.size+1];
: memcpy(p, original.data, original.size);
: p[original.size] = '\0';
: }
: char* data;
: int size;
: 谢谢。更新了一下 ,还有问题么?
: 更新了成员变量。

avatar
c*n
8
MyStr::MyStr(const MyStr& original)
{
p = new char[original.size+1];
memcpy(p, original.data, original.size);
==> p[original.size+1] = '\0';
}
There is a buffer overflow issue. Should be p[original.size] = '\0'
avatar
m*n
9
这个是我写错了,原题是orignal size的。。

【在 c*****n 的大作中提到】
: MyStr::MyStr(const MyStr& original)
: {
: p = new char[original.size+1];
: memcpy(p, original.data, original.size);
: ==> p[original.size+1] = '\0';
: }
: There is a buffer overflow issue. Should be p[original.size] = '\0'

avatar
w*x
10

p每检测NULL

【在 m***n 的大作中提到】
: 这个是我写错了,原题是orignal size的。。
avatar
m*n
11
引用cannot be null ?

【在 w****x 的大作中提到】
:
: p每检测NULL

avatar
l*d
12
p, origin.data是不是都要检测null?MyStr的成员定义有没有列出来?
avatar
y*g
13
没实现copy on write?
avatar
l*8
14
class MyStr {
MyStr() : data(NULL), size(0)
{
}
MyStr(const MyStr& original) : data(NULL), size(0)
{
p = new char[original.size+1];
if (!p || !(original.data))
throw exception;
memcpy(p, original.data, original.size);
p[original.size] = '\0';
data = p;
size = original.size;
}
private:
char* data;
int size;
}

【在 m***n 的大作中提到】
: MyStr::MyStr(const MyStr& original)
: {
: p = new char[original.size+1];
: memcpy(p, original.data, original.size);
: p[original.size] = '\0';
: }
: char* data;
: int size;
: 谢谢。更新了一下 ,还有问题么?
: 更新了成员变量。

avatar
l*a
15
where does p come from?
why need member initialization list for copy constructor?
why origianl.data can't be null?

【在 l*********8 的大作中提到】
: class MyStr {
: MyStr() : data(NULL), size(0)
: {
: }
: MyStr(const MyStr& original) : data(NULL), size(0)
: {
: p = new char[original.size+1];
: if (!p || !(original.data))
: throw exception;
: memcpy(p, original.data, original.size);

avatar
l*8
16
Thank you for the comments.

【在 l*****a 的大作中提到】
: where does p come from?
: why need member initialization list for copy constructor?
: why origianl.data can't be null?

avatar
l*8
17
Thank you for the comments.
I modified my code. But I still like the initialization list :-)
class MyStr {
MyStr() : data(NULL), size(0)
{
}
~MyStr()
{
if (data != NULL)
delete [] data;
}
MyStr(const MyStr& original) : data(NULL), size(0)
{
data = new char[original.size+1];
if(original.data == NULL)
return;
memcpy(data, original.data, original.size);
data[original.size] = '\0';
size = original.size;
}
private:
char* data;
int size;
}

【在 l*****a 的大作中提到】
: where does p come from?
: why need member initialization list for copy constructor?
: why origianl.data can't be null?

avatar
l*a
18
你为什么要保留没有意义的code?
btw, if u really want to keep them,
I suggest u just keep
MyStr(const MyStr& original) : size(original.size)

【在 l*********8 的大作中提到】
: Thank you for the comments.
: I modified my code. But I still like the initialization list :-)
: class MyStr {
: MyStr() : data(NULL), size(0)
: {
: }
: ~MyStr()
: {
: if (data != NULL)
: delete [] data;

avatar
l*8
19
MyStr(const MyStr& original)
{
if(original.data == NULL) {
data = NULL;
size = 0;
return;
}
data = new char[original.size+1];
memcpy(data, original.data, original.size);
data[original.size] = '\0';
size = original.size;
}

【在 l*****a 的大作中提到】
: 你为什么要保留没有意义的code?
: btw, if u really want to keep them,
: I suggest u just keep
: MyStr(const MyStr& original) : size(original.size)

avatar
l*8
20
不太理解。
copy constructor是用在下面两种情况:
MyClass A(B); // B is a MyClass object
MyClass A = B;
为什么要判断参数是否就是自身呢?为什么要return呢?
你说的是operator = ?
avatar
d*y
21
sorry,我看成 是assignment了(A=B),抱歉

【在 l*********8 的大作中提到】
: 不太理解。
: copy constructor是用在下面两种情况:
: MyClass A(B); // B is a MyClass object
: MyClass A = B;
: 为什么要判断参数是否就是自身呢?为什么要return呢?
: 你说的是operator = ?

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。