【发布时间】:2021-01-07 23:54:31
【问题描述】:
以下是具有不同类型的推回的代码。我的意思是用不同的输入反击。一个例子是accounts.push_back(five)。我不确定为什么每种推回的构造函数打印输出都不同。不仅顺序不同,而且使用的深拷贝构造函数的次数也不同。
#include <iostream>
#include <vector>
class account
{
private:
std::string *name_ptr;
double *total_ptr;
public:
std::string get_name() { return *name_ptr; }
void set_name(std::string new_name) { *name_ptr = new_name; }
double get_total() { return *total_ptr; }
void set_total(double new_total) { *total_ptr = new_total; }
void deposit(double amount) { *total_ptr += amount; }
void withdraw(double amount) { *total_ptr -= amount; }
account(std::string name, double total = 0)
{
name_ptr = new std::string {name};
total_ptr = new double {total};
std::cout << "Constructor for " << *name_ptr << std::endl;
}
account(const account &source)
: account {*(source.name_ptr), *(source.total_ptr)}
{ std::cout << "Deep copy constructor for " << *name_ptr << std::endl; }
account(account &&source) noexcept
: name_ptr(source.name_ptr), total_ptr(source.total_ptr)
{
source.name_ptr = nullptr;
source.total_ptr = nullptr;
std::cout << "Move constructor for " << *name_ptr << std::endl;
}
~account()
{
if(name_ptr == nullptr) std::cout << "Destructor for nullptr" << std::endl;
else std::cout << "Destructor for " << *name_ptr << std::endl;
delete name_ptr;
delete total_ptr;
}
};
int main()
{
std::vector<account> accounts;
account one {"Jonathon Stevenson"};
accounts.push_back( account(one) );
account two {"Cliffard Stevenson"};
accounts.push_back( account(two) );
account three {"Tom Stevenson"};
accounts.push_back( account(three) );
std::cout << std::endl;
account four {"Jonathon Richardson"};
accounts.push_back(four);
account five {"Cliffard Richardson"};
accounts.push_back(five);
account six {"Tom Richardson"};
accounts.push_back(six);
std::cout << std::endl;
accounts.push_back( account {"Jonathon Watson"} );
accounts.push_back( account {"Cliffard Watson"} );
accounts.push_back( account {"Tom Watson"} );
std::cout << std::endl;
accounts.push_back( account("Jonathon Sullivanson") );
accounts.push_back( account("Cliffard Sullivanson") );
accounts.push_back( account("Tom Sullivanson") );
std::cout << std::endl;
return 0;
}
输出:
Constructor for Jonathon Stevenson
Constructor for Jonathon Stevenson
Deep copy constructor for Jonathon Stevenson
Move constructor for Jonathon Stevenson
Destructor for nullptr
Constructor for Cliffard Stevenson
Constructor for Cliffard Stevenson
Deep copy constructor for Cliffard Stevenson
Move constructor for Cliffard Stevenson
Move constructor for Jonathon Stevenson
Destructor for nullptr
Destructor for nullptr
Constructor for Tom Stevenson
Constructor for Tom Stevenson
Deep copy constructor for Tom Stevenson
Move constructor for Tom Stevenson
Move constructor for Jonathon Stevenson
Move constructor for Cliffard Stevenson
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Constructor for Jonathon Richardson
Constructor for Jonathon Richardson
Deep copy constructor for Jonathon Richardson
Constructor for Cliffard Richardson
Constructor for Cliffard Richardson
Deep copy constructor for Cliffard Richardson
Move constructor for Jonathon Stevenson
Move constructor for Cliffard Stevenson
Move constructor for Tom Stevenson
Move constructor for Jonathon Richardson
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Constructor for Tom Richardson
Constructor for Tom Richardson
Deep copy constructor for Tom Richardson
Constructor for Jonathon Watson
Move constructor for Jonathon Watson
Destructor for nullptr
Constructor for Cliffard Watson
Move constructor for Cliffard Watson
Destructor for nullptr
Constructor for Tom Watson
Move constructor for Tom Watson
Move constructor for Jonathon Stevenson
Move constructor for Cliffard Stevenson
Move constructor for Tom Stevenson
Move constructor for Jonathon Richardson
Move constructor for Cliffard Richardson
Move constructor for Tom Richardson
Move constructor for Jonathon Watson
Move constructor for Cliffard Watson
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Destructor for nullptr
Constructor for Jonathon Sullivanson
Move constructor for Jonathon Sullivanson
Destructor for nullptr
Constructor for Cliffard Sullivanson
Move constructor for Cliffard Sullivanson
Destructor for nullptr
Constructor for Tom Sullivanson
Move constructor for Tom Sullivanson
Destructor for nullptr
Destructor for Tom Richardson
Destructor for Cliffard Richardson
Destructor for Jonathon Richardson
Destructor for Tom Stevenson
Destructor for Cliffard Stevenson
Destructor for Jonathon Stevenson
Destructor for Jonathon Stevenson
Destructor for Cliffard Stevenson
Destructor for Tom Stevenson
Destructor for Jonathon Richardson
Destructor for Cliffard Richardson
Destructor for Tom Richardson
Destructor for Jonathon Watson
Destructor for Cliffard Watson
Destructor for Tom Watson
Destructor for Jonathon Sullivanson
Destructor for Cliffard Sullivanson
Destructor for Tom Sullivanson
【问题讨论】:
-
欢迎来到 StackOverflow,感谢您提供好的示例程序。如果您编辑问题以显示结果输出,这将有所帮助。
-
totalPtr永远不会被删除! 为什么要使用指针 (因为它使代码更复杂)? -
我添加了输出。另外,我在析构函数中添加了 name_ptr 和 total_ptr 的删除。我使用指针来使用移动构造函数。
-
不要在这里使用指针(它们不是必需的,没有任何作用,会使代码更加复杂和不正确 - 你有内存泄漏)并遵循the rule of zero 和单一责任原则。
标签: c++ class constructor push-back move-constructor