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,因为否则我会将实现的细节泄漏到我的界面中。但遗憾的是,如果必须允许移动语义,这是不可能的。