half-dreamer / AP1400-2-HW3

0 stars 0 forks source link

关于HW3里后置++重载函数的思考 #1

Open ran0216 opened 3 weeks ago

ran0216 commented 3 weeks ago

真实的后置++返回的是右值,是一个临时变量,作者的写法是: BST& BST::operator++(int) { BST temp = new BST(this); for (auto node : nodesOfBST(this->get_root())) { node->value = node->value + 1; } return temp; } 而我认为更加合适的写法是: BST BST::operator++(int) { BST temp = this; for (auto node : nodesOfBST(this->get_root())) { node->value = node->value + 1; } return temp; } 此处不仅少开辟一个内存区域,而且更恰当,这个右值临时变量可使TEST31中的语句BST bst2{bst1++};触发移动构造函数,更符合后置++的做法,作者的写法没有使其触发移动构造函数。 如果大家尝试了在移动构造函数中打印东西,但TEST31没有打印出来而感到困惑,可参考 https://www.bilibili.com/video/BV1SG41197RC/?share_source=copy_web&vd_source=c0bdd46fe5d3a0f5e7e34670581304ea

half-dreamer commented 5 days ago

真实的后置++返回的是右值,是一个临时变量,作者的写法是: BST& BST::operator++(int) { BST temp = new BST(this); for (auto node : nodesOfBST(this->get_root())) { node->value = node->value + 1; } return temp; } 而我认为更加合适的写法是: BST BST::operator++(int) { BST temp = this; for (auto node : nodesOfBST(this->get_root())) { node->value = node->value + 1; } return temp; } 此处不仅少开辟一个内存区域,而且更恰当,这个右值临时变量可使TEST31中的语句BST bst2{bst1++};触发移动构造函数,更符合后置++的做法,作者的写法没有使其触发移动构造函数。 如果大家尝试了在移动构造函数中打印东西,但TEST31没有打印出来而感到困惑,可参考 bilibili.com/video/BV1SG41197RC?share_source=copy_web&vd_source=c0bdd46fe5d3a0f5e7e34670581304ea

感谢指正!