片段1
#include <iostream>
#include <string>
class Point {
public:
Point(int x, int y) {
this->x = x;
this->y = y;
}
~Point() {
std::cout << "point (" << x << ", " << y << ")" << "has been destruct" << std::endl;
}
int x;
int y;
};
class Test {
public:
Test(Point p): p(p) {
}
Point getP() const {
return p;
}
private:
Point p; // there is a new memory has been locate
};
void run() {
Test* t;
{
Point p(0, 1); // create a new point
t = new Test(p); // copy a new point as parameter && create a new point when locate for t
}
Point _p = t->getP();
std::cout << _p.x << std::endl;
}
int main() {
run();
}
output
point (0, 1)has been destruct
point (0, 1)has been destruct
point (0, 1)has been destruct
分析
見代碼註釋
片段2
#include <iostream>
#include <string>
class Point {
public:
Point(int x, int y) {
this->x = x;
this->y = y;
}
~Point() {
std::cout << "point (" << x << ", " << y << ")" << "has been destruct" << std::endl;
}
int x;
int y;
};
class Test {
public:
Test(const Point& p): p(p) { // change to pass by const reference
}
Point getP() const {
return p;
}
private:
Point p; // there is a new memory has been locate
};
void run() {
Test* t;
{
Point p(0, 1);
t = new Test(p); // now no new point was created when pass parameter, only locate for t
}
Point _p = t->getP();
}
int main() {
run();
}
output
point (0, 1)has been destruct
point (0, 1)has been destruct