求助构造函数内参数执行顺序
  • 板块学术版
  • 楼主Federico2903
  • 当前回复6
  • 已保存回复7
  • 发布时间2024/1/7 15:28
  • 上次更新2024/1/7 17:27:47
查看原帖
求助构造函数内参数执行顺序
381949
Federico2903楼主2024/1/7 15:28

如题。我现在有如下一个构造凸包的代码:

class convex {
public:
	struct point {
		long double x, y;
		point() {}
		point(int _x, int _y) : x(_x), y(_y) {}
	};
	struct line {
		long double k, b;
		line(point a, point b) {
			if (b.x - a.x == 0) { (this -> k = 1e12, this -> b = a.x); return; }
			this -> k = (b.y - a.y) / (b.x - a.x);
			this -> b = a.y - k * a.x;
		}
		long double at(long double x) { return k * x + b; }
		long double slope() { return k; }
	};
private:
	vector <point> p;
	long double slope(point a, point b) { return line(a, b).slope(); }
	bool check_slope(line A, line B) { return compare(A.slope(), B.slope()) == -1; }
public:
	void clear() { p.clear(); }
	void add(point x) {
		int siz = p.size();
		while (siz >= 2 && check_slope(line(p[siz - 2], p[siz - 1]), line(p[siz - 1], x)))
			p.pop_back(), siz--;
		p.push_back(x);
	}
	bool check(point a, point b) {
		point P;
		if (p.size() == 1) P = p[0];
		else {
			int l = 0, r = p.size() - 2;
			while (l < r) {
				int mid = (l + r) >> 1;
				if (check_slope(line(p[mid], p[mid + 1]), line(a, b))) r = mid;
				else l = mid + 1;
			}
			if (check_slope(line(p[r], p[r + 1]), line(a, b))) P = p[r];
			else P = p[r + 1];
		}
		return compare(line(a, b).at(P.x), P.y) == -1;
	}
};

可以看到 convex::point 的构造函数接受两个参数。然而当我写如下代码的时候,他出现了错误:

rep (i, 1, n) p[i] = convex::point(read(), read());

我调试了很久才发现是输入有问题,当我将构造函数的 _x 和 _y 反转后,就正确了。

我测试了如下代码,答案也是正确的:

rep (i, 1, n) p[i].x = read(), p[i].y = read();

求助这个是固定从右往左执行,还是随编译器的改变而改变行为。

2024/1/7 15:28
加载中...