Gha*_*ham 2 c++ constructor move-constructor c++11
我编写了以下代码来演示移动构造。但是即使我使用了 std::move(),也没有调用移动构造函数。有人可以看看这里有什么问题。
#include "point.hpp"
using namespace std;
class point;
d2point add_point(d2point&& p1, d2point&& p2)
{
cout << "inside add point function" << endl;
d2point z;
z.setX(p1.getX() + p2.getX());
z.setY(p1.getY() + p2.getY());
return z;
}
int main()
{
d2point x(2,3);
d2point y(2,3);
d2point z = add_point(move(x), move(y));
z.print_point();
x.print_point();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是来自point.hpp的代码
using namespace std;
class point
{
private:
int x;
public:
point(){cout << "point default constructor gets called" << endl;}
point(int x){ cout << "point param constructor gets called" << endl;
this->x = x;
}
point(const point& p){
cout << "point copy constructor gets called" << endl;
this->x = p.x;
}
point(point&& other):x(std::move(other.x)) {
cout << "point move constructor gets called" << endl;
}
int getX(){return x;}
void setX(int x) { this->x = x; }
virtual void print_point() {}
virtual ~point(){cout << "point destructor gets called" << endl;}
};
class d2point: public point
{
private:
int y;
public:
d2point()
{
cout << "d2point default constructor gets called" << endl;
}
d2point(int x, int y):point(x) {
cout << "d2point parameterized constructor gets called" << endl;
this->y = y;
}
d2point(const d2point& rhs): point(rhs) {
cout << "d2point copy constructor gets called" << endl;
this->y = rhs.y;
}
d2point(d2point&& rhs):point(std::move(rhs)) {
cout << "d2point move constructor gets called" << endl;
this->y = std::move(rhs.y);
rhs.y = 0;
}
int getY(){return y;}
void setY(int y) { this->y = y; }
void print_point(){
cout << "(" << getX() << "," << y << ")" << endl;
}
~d2point(){ cout << "d2point destructor gets called" << endl;}
};
Run Code Online (Sandbox Code Playgroud)
程序的输出如下:
point param constructor gets called
d2point parameterized constructor gets called
point param constructor gets called
d2point parameterized constructor gets called
inside add point function
point default constructor gets called
d2point default constructor gets called
(4,6)
(2,3)
d2point destructor gets called
point destructor gets called
d2point destructor gets called
point destructor gets called
d2point destructor gets called
point destructor gets called
Run Code Online (Sandbox Code Playgroud)
这里正在调用获取右值引用的函数,但是没有打印移动构造函数语句,它确实被调用了或者正在调用其他一些成员函数。请在这里查看问题。
除非您正在构造d2pointfrom的新实例,否则不会调用移动构造函数d2point&&。在您的add_point函数中,您正在对:进行右值引用d2point:这意味着您没有构建任何新实例,而只是引用现有实例:
d2point add_point(d2point&& p1, d2point&& p2)
// ^^ ^^
Run Code Online (Sandbox Code Playgroud)
请记住,这std::move只是对右值引用的强制转换。
d2point z = add_point(move(x), move(y));
Run Code Online (Sandbox Code Playgroud)
在上面的行中,您同时将xand投射y到d2point&&- 它们被绑定到p1and p2。还没有施工。最后,将add_point调用结果存储到z. 由于返回值优化,您极有可能不会在那里看到调用的移动构造函数。
更改add_point为
d2point add_point(d2point p1, d2point p2)
Run Code Online (Sandbox Code Playgroud)
肯定会调用d2point::d2point(d2point&&).
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |