2013-4-12.3~成员函数、友元函数和一般函数。。。

本文通过成员函数、友元函数及一般函数三种方式,实现了计算二维平面上两点间欧氏距离的功能。展示了不同函数类型的具体实现细节,并在主函数中进行了调用示例。
/*    
* 程序的版权和版本声明部分    
* Copyright (c)2013, 烟台大学计算机学院学生    
* All rightsreserved.    
* 文件名称: 时间类.cpp    
* 作者:王筱菀    
* 完成日期: 2013 年4 月12日    
* 版本号: v1.0    
* 输入描述:无    
* 问题描述: 利用成员函数、友元函数和一般函数,实现上三个版本的求两点间距离的函数 
* 程序输出:两点间的距离   
*/         
#include<iostream>
#include<cmath>
using namespace std;
class CPoint
{
private:
double x; // 横坐标
double y; // 纵坐标
public:
CPoint(double xx=0,double yy=0):x(xx),y(yy){}//参数初始化表对数据成员初始化
void distance1(CPoint p);//成员函数声明
friend void distance2(CPoint &p1,CPoint &p2);//友元函数声明
double getx(){return x;}
double gety(){return y;}
};
void distance3(CPoint &p1,CPoint &p2);//一般函数声明
void CPoint::distance1(CPoint p)//成员函数的实现,前不加CPoint::
{
	//直接访问私有数据成员
	double dis=sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
	cout<<"此两点的距离为:"<<dis<<endl;
}
void distance2(CPoint &p1,CPoint &p2)//友元函数的实现,前要加CPoint::
{
	double dis=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
	cout<<"此两点的距离为:"<<dis<<endl;
}
void distance3(CPoint &p1,CPoint &p2)
{
	double dis=sqrt((p1.getx()-p2.getx())*(p1.getx()-p2.getx())+(p1.gety()-p2.gety())*(p1.gety()-p2.gety()));
	cout<<"此两点的距离为:"<<dis<<endl;
}
int main()
{
	CPoint p1,p2(3,4);
	p1.distance1(p2);//成员函数的调用
	distance2(p1,p2);//友元函数的调用
    distance3(p1,p2);//一般函数的调用
    system("pause");
	return 0;
}

### C++ 成员函数友元函数的关系及区别 #### 1. 定义与访问权限 成员函数是类的一部分,可以直接访问类的私有保护成员。友元函数虽然不是类的成员,但通过类的显式声明,可以访问类的所有成员(包括私有保护成员)[^1]。 #### 2. 声明方式 - **成员函数**:在类中定义或声明为类的一部分。 - **友元函数**:需要在类中使用 `friend` 关键字进行声明,并且其定义通常位于类外部。例如: ```cpp class A { private: int data; public: friend void set_show(int x, A &a); // 友元函数声明 }; void set_show(int x, A &a) { // 友元函数定义 a.data = x; std::cout << a.data << std::endl; } ``` #### 3. 访问方式 - **成员函数**:通过对象调用,隐含一个 `this` 指针,指向调用该函数的对象。 - **友元函数**:不隶属于任何对象,直接以普通函数的形式调用,无法使用 `this` 指针[^3]。 #### 4. 封装性 - **成员函数**:遵循封装原则,作为类的一部分,增强类的内聚性。 - **友元函数**:破坏封装性,允许非成员函数访问类的私有成员,应谨慎使用[^2]。 #### 5. 使用场景 - **成员函数**:适用于实现类内部逻辑的操作。 - **友元函数**:常用于需要外部函数访问类私有成员的场景,如运算符重载[^4]。 #### 6. 示例对比 以下代码展示了成员函数友元函数的区别: ```cpp #include <iostream> using namespace std; class B { private: int value; public: B(int v) : value(v) {} void display() const { // 成员函数 cout << "Value (Member Function): " << value << endl; } friend void friend_display(const B& obj); // 友元函数声明 }; void friend_display(const B& obj) { // 友元函数定义 cout << "Value (Friend Function): " << obj.value << endl; } int main() { B b(42); b.display(); // 调用成员函数 friend_display(b); // 调用友元函数 return 0; } ``` 在上述代码中,`display` 是成员函数,通过对象 `b` 调用;`friend_display` 是友元函数,直接以普通函数形式调用。 #### 7. 性能与安全性 - **性能**:两者在性能上无显著差异。 - **安全性**:友元函数由于破坏封装性,可能增加代码维护难度,应尽量减少使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值