【发布时间】:2021-02-26 17:54:31
【问题描述】:
class Guitars
{
private:
int serialNumber{0};
float price{0.0};
// GuitarSpecs spec{};
public:
Guitars(int serNum, float price)
{
this->serialNumber = serNum;
this->price = price;
};
Guitars(const Guitars &s)
: serialNumber{s.serialNumber}, price{s.price}
{
std::cout << "Copy" << std::endl;
};
Guitars(Guitars &&source) noexcept : serialNumber{source.serialNumber}, price{source.price}
{
source.serialNumber = NULL;
source.price = NULL;
std::cout << "Move" << std::endl;
};
int GetSerial() const { return serialNumber; };
float GetPrice() const { return price; };
void SetPrice(float x) { this->price = x; }
};
class Inventory
{
private:
list<Guitars *> *guitarList;
public:
Inventory()
{
guitarList = new list<Guitars *>;
}
void AddGuitar(int serNum, float price)
{
Guitars *x = new Guitars(serNum, price);
// Guitars x(serNum,price);
guitarList->push_back(x);
}
void Display()
{
for (auto &&i : *guitarList)
{
std::cout << i->GetPrice() << " " << i->GetSerial() << endl;
}
}
~Inventory()
{
for (auto &&i : *guitarList)
{
std::cout << i->GetSerial() << " "
<< "deleted " << std::endl;
delete i;
}
std::cout << "List is deleted" << std::endl;
delete guitarList;
}
};
int main()
{
Inventory I;
I.AddGuitar(12050, 50.23);
I.AddGuitar(10000, 20.00);
I.Display();
return 0;
}
有人能解释一下为什么上面的代码中没有调用复制构造函数吗?
当我在堆上创建 Guitar 指针列表以及堆上的 Guitar 对象以及指向它们的指针并将这些指针保存在 Inventory 列表中时,不会调用复制构造函数。为什么会发生这种情况?这是否更有效,因为程序不需要创建对象的副本,它在堆上创建一次,我们将指针保存在我们身边。
【问题讨论】:
-
复制指针不会复制底层对象。
-
坦率地说,
list<Guitars *> *guitarList;是可憎的,list<Guitars> guitarList;是你应该使用的。 -
这些都不是性能最好的。我不确定您为什么要如此糟糕地使用指针。使用
std::list::emblace_back,或者如果由于某种原因不能,请移动操作。 -
@MohammadHussein 在您发布的代码中根本不需要指针。让编译器生成的复制构造函数和赋值运算符来完成工作,因为编译器知道在这种情况下如何优化代码。通过使用指针和
new/delete,您正在做的是取消编译器优化代码的手段——因此代码可能会运行更慢,而不是更快。 “使用指针优化编译器”的技巧可能在 20 年前就奏效了,但在当今优化编译器的时代,它并不总是奏效。 -
在堆上创建 List 并使用复制和移动构造函数使程序更高效 -- 这是不好的信息。在堆上创建对象不会提高程序的性能。
标签: c++ c++11 pointers c++14 copy-constructor