c++ 函数返回新对象与将函数结果分配给调用它的对象之间的区别

标签 c++

这个问题有点尴尬,但希望我的例子更有意义。

作为引用,我正在编写的程序有一个供用户输入信息的窗口,当用户单击“保存”窗口时,该窗口会创建一个 Person 对象,并使用 populatePerson() 用窗口中的信息填充它,并调用 Person 类中的函数将信息保存到文件中。

我费了一番功夫才找到窗口类调用 Person 函数的方法,因为我会得到一个关于无法调用非静态函数的错误,但后来意识到我需要第二个“空的” "调用 savePerson() 函数的 Person 对象。我还进行了类似的设置,用于从文件加载人物。

例如:

void Person::savePerson(Person p)
{
    //open file
    //write p to file
    //return
}

Person Person::loadFile(String filename)
{
    //open file
    //make new person
    //put file contents into person
    //return person
}

为了调用这些我需要做这样的事情

Person NewPerson = populatePerson();

Person Save;
Save.savePerson(NewPerson);    

Person Load;
NewPerson = Load.loadPerson("file the person was saved to");

我认为这有点尴尬,因为我没有将 Save 和 Load Persons 用于除调用其类中的函数之外的任何其他用途。我关心的对象是 NewPerson。

然后我发现我可以使用 *this 来完成 savePerson() 和 loadPerson() 中的操作,而不是传入一个 Person 或返回一个 Person。

例如:

void Person::savePerson()
{
    //open file
    //write *this to file

}

void Person::loadPerson(String filename)
{
    //open file
    //read file and put it in *this

}

然后这样称呼他们

Person NewPerson = populatePerson();

NewPerson.savePerson();
NewPerson.loadPerson("file the person was saved to");

第二个解决方案对我来说似乎更有意义,而且这两种方式似乎都能正常编译和运行。问题基本上是,这些解决方案中的一种是否比另一种更好?任何一个都是不好做的事情吗?任何一种方式都会导致意想不到的问题吗?

此外,一开始就将保存和加载函数设为静态,这样窗口就可以调用它们而不需要 Person 的实例来调用它们会更好吗?

(抱歉伪代码,实际代码主要是 Qt,这可能会引起混淆,但这似乎更像是一个一般的 C++ 问题。)

最佳答案

相信你的直觉;第二个是两者中较好的一个。当你只对一个人感兴趣时,必须创建 3 个而不是一个人,这是一个死的赠品。 savePerson 显然在书面上非常有意义(“救救我”),loadPerson 紧随其后(“从文件中填充我”),尽管如果您为 Person 创建了一个从中加载文件的构造函数,则可以避免必须要么让 Person 在调用 loadPerson 之前未初始化,要么浪费时间初始化它只是为了使用 loadPerson 覆盖它。

关于c++ 函数返回新对象与将函数结果分配给调用它的对象之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11443617/

相关文章:

c++ - 是否可以避免初始化列表中的 static_cast ?

c++ - 关于if条件和|| C++ 运算符

c++ - 如何通过一些计算创建常量数组

c++ - 使用 lambda 完美转发pair.second

java - 是否有任何代码分析工具可以使我的工作更轻松?

c++ - 如何在 QT 中停止 qThread

c++ - 栈数组变量清理

c++ - 如何在 C++ 中构造 ISO 8601 日期时间?

c++ - 如何设置 Qt 以使用 blueZ 蓝牙堆栈

c++ - 算法的大 O 表示法