第七周项目2:求两点的距离(1)成员函数

本文介绍了一个使用C++编写的简单程序,该程序通过定义一个名为CPoint的类来计算二维平面上两点之间的距离。类中包含了一个成员函数Distance(),用于计算并输出两点间的欧氏距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题及代码:

/*Copyright (c)2016,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:main.cpp
*作    者:崔青青
*完成日期:2016年4月8日
*版 本 号:v1.0
*问题描述:用类求两点间的距离,调用成员函数。
*输入描述:
*输出描述:
*/
#include<iostream>
using namespace std;
#include<cmath>
class CPoint
{
private:
    double x1,x2;//横坐标
    double y1,y2;//纵坐标
    double distance;
public:
    CPoint(double xx1=0,double yy1=0,double xx2=0,double yy2=0):x1(xx1),y1(yy1),x2(xx2),y2(yy2){}
    void Distance();


};
void CPoint::Distance()
{
    double sum;
    sum=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
    distance=sqrt(sum);
    cout<<"两点间的距离为:"<<distance<<endl;
}
int main()
{
    CPoint p(0,0,3,4);
    p.Distance();
    return 0;
}


运行结果:


知识点总结:

这个程序调用成员函数求两点之间的距离,跟一般函数和友元函数作比较。

学习心得:

应该注意在调用成员函数时的规则。

这是一个典型的计算几何问题,涉及到面向对象编程的核心思想——友元的概念以及类的设计。以下是基于题目的解析和解答: --- ### **题目分析** 我们需要设计两个核心类 `Point` 和 `Line` 来描述点和直线的关系,并利用**友元机制**实现点到线距离计算。 #### 距离公式 给定点 `(x, y)` 到直线 `ax + by + c = 0` 的距离公式为: \[ d = \frac{| ax_1 + by_1 + c |}{\sqrt{a^2 + b^2}} \] 其中 \( a^2 + b^2 \neq 0\) (由题目保证)。 --- ### **解法** 我们按照题目要分三种方法实现该功能: --- #### **方法一:全局函数 (成员函数)** 将 `dist` 定义为一个全局函数并作为 `Point` 和 `Line` 类的友元函数。 ```cpp #include <iostream> #include <cmath> using namespace std; class Point; class Line; // 全局函数 dist double dist(const Point& p, const Line& l); class Point { private: double x, y; public: // 构造函数 Point(double _x = 0, double _y = 0): x(_x), y(_y) {} friend double dist(const Point&, const Line&); }; class Line { private: double a, b, c; // 直线方程 ax + by + c = 0 public: // 构造函数 Line(double _a, double _b, double _c): a(_a), b(_b), c(_c) {} friend double dist(const Point&, const Line&); }; // 友元函数定义 double dist(const Point& p, const Line& l){ return abs(l.a * p.x + l.b * p.y + l.c) / sqrt(pow(l.a, 2) + pow(l.b, 2)); } int main(){ double px, py, la, lb, lc; cin >> px >> py; cin >> la >> lb >> lc; Point point(px, py); Line line(la, lb, lc); cout << "The distance is: " << fixed << setprecision(2) << dist(point, line) << endl; return 0; } ``` --- #### **方法二:成员函数 (Line 的成员函数)** 将 `dist` 定义为 `Line` 类的一个成员函数,并使其成为 `Point` 类的友元函数。 ```cpp #include <iostream> #include <cmath> using namespace std; class Point; class Line { private: double a, b, c; public: // 构造函数 Line(double _a, double _b, double _c): a(_a), b(_b), c(_c) {} double dist(const Point&) const; // 成员函数原型 }; class Point { private: double x, y; public: // 构造函数 Point(double _x = 0, double _y = 0): x(_x), y(_y) {} friend double Line::dist(const Point&) const; // 将 dist 声明为友元函数 }; // Member function definition for Line class double Line::dist(const Point& p) const{ return abs(a*p.x + b*p.y + c) / sqrt(pow(a, 2) + pow(b, 2)); } int main(){ double px, py, la, lb, lc; cin >> px >> py; cin >> la >> lb >> lc; Point point(px, py); Line line(la, lb, lc); cout << "The distance is: " << fixed << setprecision(2) << line.dist(point) << endl; return 0; } ``` --- #### **方法三:友元类** 将整个 `Line` 类声明为 `Point` 类的友元类,直接访问其私有成员变量。 ```cpp #include <iostream> #include <cmath> using namespace std; class Point; class Line : public Line { // 或者省略继承修饰符,默认 private 继承也可以工作 private: double a, b, c; public: // 构造函数 Line(double _a, double _b, double _c): a(_a), b(_b), c(_c) {} double dist(const Point&) const; // 成员函数原型 }; class Point { private: double x, y; public: // 构造函数 Point(double _x = 0, double _y = 0): x(_x), y(_y) {} friend class Line; // 整个 Line 类都是 Point 的友元类 }; // Member function definition for Line class double Line::dist(const Point& p) const{ return abs(a*p.x + b*p.y + c) / sqrt(pow(a, 2) + pow(b, 2)); } int main(){ double px, py, la, lb, lc; cin >> px >> py; cin >> la >> lb >> lc; Point point(px, py); Line line(la, lb, lc); cout << "The distance is: " << fixed << setprecision(2) << line.dist(point) << endl; return 0; } ``` --- ### §**相关问题§**: 1. 使用友元函数有哪些优点和缺点? 2. 如果不想使用友元机制,如何通过其他方式实现类似的功能? 3. 点到平面的距离该如何计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值