Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++_Pass By Reference - Fatal编程技术网

C++ 为什么这个函数头不是最佳的

C++ 为什么这个函数头不是最佳的,c++,pass-by-reference,C++,Pass By Reference,有点项目背景。 类目图书->包含图书信息 类BooksDB->可添加/删除/搜索书籍的书籍数据库 现在我有了下面的函数头,它打印放置在BooksDB books向量中的书籍 void printBookDetails(const std::vector<Book*>& books) void printbook详细信息(const std::vector&books) 此函数接收书本指针向量作为常量引用,将其复制到同一类型的新向量中。根据图书唯一ISBN对新矢量进行排序并

有点项目背景。
类目图书->包含图书信息
类BooksDB->可添加/删除/搜索书籍的书籍数据库

现在我有了下面的函数头,它打印放置在BooksDB books向量中的书籍

void printBookDetails(const std::vector<Book*>& books)
void printbook详细信息(const std::vector&books)
此函数接收书本指针向量作为常量引用,将其复制到同一类型的新向量中。根据图书唯一ISBN对新矢量进行排序并打印它们

现在有人问我,为什么上面的函数头在接收参数的方式上不是最优的,应该如何重写,为什么选择这个函数头


我很想得到一个建议,因为我已经阅读了所有关于将对象传递给函数的内容,但无法解决这一问题。

printBookDetails
中,如果要制作向量的副本,则可以将其更改为

void printBookDetails(std::vector<Book*> books)
void printbook详细信息(标准::矢量书)
并为您生成副本。这样可以避免在函数中执行此操作


另一个好处是,如果将r值传递给函数,那么移动语义将起作用,从而节省复制向量的成本。

如果要在函数中进行复制,为什么不直接传递值呢?它将为您节省一行代码。这很有意义。但是,这个函数头对传递值有什么好处呢?向量是指针,所以即使有数千甚至数百万个条目,我强烈怀疑,与传递值的实际打印(进行字符串格式化和I/O)相比,向量的复制可以忽略不计:它不仅可以为您节省一行代码,它实际上允许复制省略/移动构造函数,而您的代码不允许。然而,为什么它更喜欢使用const引用头?@Elia:您告诉我们。从你告诉我们的来看,这似乎是错的。如果您只是复制引用而从不使用引用,则没有理由通过引用传递。@Elia如果您不打算复制引用,则最好使用它,因为复制向量可能会很昂贵。如果您总是要制作副本,那么通过值传递就可以了,因为无论发生什么情况,都会制作副本。在仔细研究了一些之后,在函数末尾添加一个“const”是否有助于用户更方便地理解函数的工作原理?就个人而言,我仍然喜欢使用by
const
-ref,因为否则我会将实现的细节泄漏到我的界面中。但遗憾的是,如果必须允许移动语义,这是不可能的。