C++ 在c+中,哪个范围循环(auto、auto&;、const auto&;)更有效+;11 //示例程序 #包括 #包括 #包括 #包括 一班 { 公众: 一(整数年龄,整数价格) :m_年龄(年龄),m_价格(价格) { 标准::cout
最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示 它确实触发了一个构造函数:复制构造函数。但您没有插入该构造函数†,因此您看不到任何输出。另外两种情况不会构造新对象,因此肯定会更有效 请注意,(auto&&it:vecOnes){…}还有第四种情况C++ 在c+中,哪个范围循环(auto、auto&;、const auto&;)更有效+;11 //示例程序 #包括 #包括 #包括 #包括 一班 { 公众: 一(整数年龄,整数价格) :m_年龄(年龄),m_价格(价格) { 标准::cout,c++,c++11,C++,C++11,最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示 它确实触发了一个构造函数:复制构造函数。但您没有插入该构造函数†,因此您看不到任何输出。另外两种情况不会构造新对象,因此肯定会更有效 请注意,(auto&&it:vecOnes){…}还有第四种情况,它与第二种情况相同,也不会创建任何新对象 †现在您编辑了您的问题,应该很清楚,一种情况确实构建了新对象,而其他情况都没有 最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示 它确实触发了一个构造函数:复制
,它与第二种情况相同,也不会创建任何新对象
†现在您编辑了您的问题,应该很清楚,一种情况确实构建了新对象,而其他情况都没有
最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示
它确实触发了一个构造函数:复制构造函数。但您没有插入该构造函数†,因此您看不到任何输出。另外两种情况不会构造新对象,因此肯定会更有效
请注意,(auto&&it:vecOnes){…}
还有第四种情况,它与第二种情况相同,也不会创建任何新对象
†现在您编辑了您的问题,应该很清楚,一种情况确实构建了新对象,而其他情况都没有。事实是,这取决于
如果您刚刚得到一个内置类型的向量,例如int
,那么您最好使用auto-it
,因为复制成本很低,并且每次使用该值时都会保存一个解引用。对于类,这将调用复制构造函数,这可能会影响性能
但是,如果你认为vector包含一个类,那么一般来说,使用auto&it
或const auto&it
来节省创建对象副本的时间会更有效。与非const
相比,使用const
没有成本优势,这取决于你想如何与对象交互。事实是,这取决于
如果您刚刚得到一个内置类型的向量,例如int
,那么您最好使用auto-it
,因为复制成本很低,并且每次使用该值时都会保存一个解引用。对于类,这将调用复制构造函数,这可能会影响性能
但是,如果你认为vector包含一个类,那么一般来说,使用auto&it
或const auto&it
来节省创建对象副本的时间会更有效。与非const
相比,使用const
没有成本优势,这取决于你想如何与对象交互。我希望auto会触发类1的构造函数。但它不会根据输出结果显示这种方式。
您的类有两个构造函数,但您只检测了一个。调用的是另一个构造函数,即复制构造函数,它不会生成任何输出。如果您想看到它,请将其实现为打印n操作。@IgorTandetnik,谢谢您的评论。@Igor答案属于回答。我回滚了您的编辑。请不要将答案编辑到您的问题中。我希望自动将触发类1的构造函数。但它不会根据输出结果显示这种方式。
您的类有两个构造函数,但您只插入了指令一个。它是另一个被调用的复制构造函数,它不会产生任何输出。如果您想看到它在运行,请实现它来打印一些内容。@igortandtnik,谢谢您的评论。@Igor答案属于回答。我回滚了您的编辑。请不要将答案编辑到您的问题中。
// Example program
#include <iostream>
#include <ostream>
#include <string>
#include <vector>
class One
{
public:
One(int age, int price)
: m_age(age), m_price(price)
{
std::cout << "m_age: " << m_age << " , m_price: " << m_price << std::endl;
}
One(const One&) = default;
One& operator=(const One&) = default;
int age() const { return m_age; }
int price() const { return m_price; }
private:
int m_age;
int m_price;
};
std::ostream& operator<<(std::ostream& os, const One& one)
{
os << "<< m_age: " << one.age() << " , m_price: " << one.price();
return os;
}
int main()
{
std::vector<One> vecOnes = {{1, 2}, {3, 4}};
//for(auto it: vecOnes) // case I
//for(auto& it: vecOnes) // case II
for(const auto& it: vecOnes) // case III
{
std::cout << it << std::endl;
}
}
m_age: 1 , m_price: 2
m_age: 3 , m_price: 4
<< m_age: 1 , m_price: 2
<< m_age: 3 , m_price: 4