有课
class Cow{
char name[20];
char* hobby;
double weight;
public:
[..]
Cow & operator=(const Cow &c);
[..]
};
我想知道如何编写operator=
方法的定义。
我写的定义等于 -
Cow & Cow::operator=(const Cow &c){
if(this==&c)
return *this;
delete [] hobby;
hobby=new char [strlen(c.hobby)+1];
weight=c.weight;
strncpy(name,c.name,20);
return *this;
}
但是,如果已经创建了名称[20]与“Philip Maciejowsky”相似并且我对它“亚当”的描述。在operator =(...)之后命名等于“adamlip Maciejowsky”? 如果它覆盖那么如何解决?
答案 0 :(得分:1)
使用strcpy()
或使用strncpy()
后添加空终止符。 strncpy()
不会添加空终结符(\0
),其中strcpy()
会这样做。
我的建议:使用std::string
代替c-styled
null终止字符串。
在罗马时,做罗马人!
如果source长于> num,则在目标末尾不会隐式附加空字符(因此,在这种情况下,目标可能不是空终止的C字符串)。
由于Adam
的长度小于Philip Maciejowsky
,因此strncpy()
不会使用Philip Maciejowsky
填充剩余的目标(即\0
)。因此输出看起来像:
Adamip Maciejowsky
- strcpy()
或正在memset(destination, 0, lengthOfDestination)
然后调用strncpy()
会导致您的输出也为Adam
。多种方式来做你想做的事情。
答案 1 :(得分:0)
首先,如果你正在使用C ++,你不应该使用C风格的字符串,而应该使用类std :: string,这样可以在各方面使一切变得更容易。
假设您需要使用char *字符串,strncpy会处理这个问题。 C样式字符串以空值终止,这意味着诸如"test"
之类的字符串占用五个字节。字节顺序为{'t', 'e', 's', t', 0}
。零(或空)字节用作已到达字符串末尾的标记。
从我系统上strncpy的联机帮助页:
以下内容将chararray设置为abc\0\0\0
:
char chararray[6];
(void)strncpy(chararray, "abc", sizeof(chararray));
所以这意味着该字符串将包含"adam\0\0\0\0\0\0\0[etc.]"
,其中\0
表示空字节。字符串函数在读取第一个空值时将停止处理(因为,请记住,使用C风格的字符串,没有办法知道字符串的长度而不扫描它,寻找\0
)。