uacs2024

导航

C++看程序写结果:调用一次Line类构造函数,执行几次Point类复制构造函数?

C++看程序写结果:调用一次Line类构造函数,执行几次Point类复制构造函数?

#include <iostream>
#include <cmath>
using namespace std;

class Point { //Point类定义
public:
    Point(int xx = 0, int yy = 0) {
        x = xx;
        y = yy;
    }
    Point(Point &p);
    int getX() { return x; }
    int getY() { return y; }
private:
    int x, y;
};

Point::Point(Point &p) { //复制构造函数的实现
    x = p.x;
    y = p.y;
    cout << "Calling the copy constructor of Point" << "x=" << x<< ",y=" <<y <<endl;
}

//类的组合
class Line { //Line类的定义
public: //外部接口
    Line(Point xp1, Point xp2, Point xp3);
    Line(Line &l);
    double getLen() { return len; }
private: //私有数据成员
    Point p2, p1,p3; //Point类的对象p1,p2
    double len;
};

//组合类的构造函数
Line::Line(Point xp1, Point xp2,Point xp3) : p1(xp1), p2(xp2), p3(xp3) {
    cout << "Calling constructor of Line" << endl;
    double x = static_cast<double>(p1.getX() - p2.getX());
    double y = static_cast<double>(p1.getY() - p2.getY());
    len = sqrt(x * x + y * y);
}

Line::Line (Line &l): p1(l.p1), p2(l.p2) , p3(l.p3) {//组合类的复制构造函数
    cout << "Calling the copy constructor of Line" << endl;
    len = l.len;
}

//主函数
int main() {
    Point myp1(1, 2), myp2(3, 4),myp3(5,6); //建立Point类的对象
    Line line(myp1, myp2,myp3); //建立Line类的对象
    return 0;
}

一共执行6次point类复制构造函数。前三次是把point类的值传入line类构造函数,后三次是根据line类声明的先后顺序,通过初始化列表执行point类复制构造函数。

特别反直觉的是,虽然是 line(myp1,myp2,myp3) ,但是最先执行复制构造函数的是myp3,传值进去的构造顺序是反过来的。

Calling the copy constructor of Pointx=5,y=6
Calling the copy constructor of Pointx=3,y=4
Calling the copy constructor of Pointx=1,y=2
Calling the copy constructor of Pointx=3,y=4
Calling the copy constructor of Pointx=1,y=2
Calling the copy constructor of Pointx=5,y=6
Calling constructor of Line

 

posted on 2024-03-18 21:05  ᶜʸᵃⁿ  阅读(9)  评论(0编辑  收藏  举报