Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按值返回对象?_C++_Oop_Return Value - Fatal编程技术网

C++ 按值返回对象?

C++ 按值返回对象?,c++,oop,return-value,C++,Oop,Return Value,我试图从函数返回一个本地对象 我有这个问题 如果我返回本地创建的对象,它将返回null DString DString :: operator + (const char* param) { // Variable definition int nSize = ( this->GetLength() + (strlen(param))); // Create a new char array in the opropriate size char* cstrNewStrin

我试图从函数返回一个本地对象

我有这个问题

如果我返回本地创建的对象,它将返回null

DString DString :: operator + (const char* param)
{
    // Variable definition
    int nSize = ( this->GetLength() + (strlen(param)));
// Create a new char array in the opropriate size
char* cstrNewString = new char[nSize + 1];

// Append data
strcpy(cstrNewString, this->_cstrString);
strcat(cstrNewString, (char*)param);
cstrNewString[nSize] = '\0';

// Create a new DString to return
DString dstNewData(cstrNewString);

// Clean up
delete[] cstrNewString;

// Return data
return (dstNewData); // Null!
如果我只在返回行中创建一个新对象,则执行相同的操作,如下所示:

DString DString :: operator + (const char* param)
{
    // Variable definition


int nSize = ( this->GetLength() + (strlen(param)));

// Create a new char array in the opropriate size
char* cstrNewString = new char[nSize + 1];

// Append data
strcpy(cstrNewString, this->_cstrString);
strcat(cstrNewString, (char*)param);
cstrNewString[nSize] = '\0';

// Create a new DString to return
DString dstNewData(cstrNewString);

// Clean up
delete[] cstrNewString;

// Return data
return (DString(dstNewData.ToCharArray())); // Not null, returns correctly!

它返回正确。。它为什么要这样做?我如何解决这个问题?

在第一种情况下,通过值传递,如果没有定义默认构造函数,则隐式使用默认构造函数DString::DStringchar*。在第二种情况下,显式调用构造函数,但可能是另一个构造函数,可能是DString::DStringchar const*,这取决于dstNewData.ToCharArray的constanness。另外,请看一下Scott Meyers的有效C++项目21,因为它可能会因为优化而增加额外的混淆。定义并向我们展示你的构造函数,行为应该得到更多的控制

这是一个猜测,实际上没有看到您的构造函数。

一些评论: 1您要复制到cstrNewString的字符串有多大?您如何知道它们适合cstrNewString

2更喜欢strncpy而不是strcpy-使用strcpy,可以超过阵列的大小

3.为什么你只是在几行之后才删除它,却要使用new?我会在堆栈上免费分配它。绳子会更好


4 cstrNewString[nSize]->您如何知道null被放置在字符串的末尾?这两者之间有差距吗?

我认为第一个函数不返回NULL,但当您对返回的对象调用tocharray时,它返回NULL


这可能与您可能没有实现复制构造函数这一事实有关,您应该将字符缓冲区从参数对象复制到This对象上。您的复制构造函数是如何定义的?在第一种情况下,副本 构造函数被调用;在第二个不,你没有给我们看任何 DString的基本代码,但考虑到明显的语义,它似乎 几乎可以肯定,编译器生成的复制构造函数不会 做正确的事。如果您是,则DString包含一个动态 分配了指针,我不知道它是如何分配的,这是
在析构函数中删除,复制构造函数必须进行深度复制。

我必须问,std::string有什么问题?您需要向我们展示构造函数DString::DStringchar*{}。除非您对传递的字符串进行深度复制,由于在下一个语句中取消分配字符串,对象剩下的是一个悬空指针。此外,DString应该遵守三个规则。已经说过,因为这是C++,所以可以使用STD::string和char *来保存上述所有麻烦。对于STD::String,与您所经历的char相比,很难出错。如果是这样的话,复制构造函数可能有问题,并且当使用第二种方法时,复制构造函数可能会被忽略,但不是第一种方法。在返回对象之前,对象必须有效。我的钱是坏拷贝的,C++不是LISP;你不需要大部分的括号。例如,更改int nSize=this->GetLength+strlenparam;to int nSize=GetLength+strlenparam;。注意,我还删除了不必要的this->。所有这些括号只会使代码很难阅读。3使用new的原因是编译时不知道大小。他在分配之前计算必要的长度。在这种情况下,我认为使用strcpy没有任何风险。另一方面,您不应该使用strncpy,因为它可以在没有“\0”终止符的情况下离开目标。1我不知道,这就是我检查大小的方式。2没有真正的理由,只是一个老习惯。3已经有一段时间没有用C编写代码了,我想让自己记住自己释放内存会很好。对不起,我不明白这个问题。你在哪里看到引用的返回。是的,这是传递值,我误读了代码。我想问题还是一样的,所以我要更正答案。DString::DStringchar*不是复制构造函数!实际上,复制构造函数在第一种和第二种情况下都被调用!正如我在一个评论中所说的,我对C++的工作方式是新的,我在军队里学习了C’,我对OOP的唯一了解是C,所以我不知道这里有拷贝或者甚至需要。谢谢你的帮助。@Sdra:怎么做?DString X=DString;;运算符=!=CopyConstructor@Sdra大概形式上,每当返回变量时都会调用copy构造函数,并且必须有一个可访问的变量。实际上,这取决于编译器是执行NRVO还是RVO。因为他说他是C++新手,但是,似乎缺少一个拷贝构造函数是一个可能的问题。