关于友元函数没声明也能运行的问题

问题描述

关于友元函数没声明也能运行的问题
#include
using namespace std;
#include
class point{
private:
int xy;
friend int dist1(point p1point p2);

public:
point(int a=10int b=10){ x=a; y=b; }
int getx( ){ return x; }
int gety( ){ return y; }
};
int dist1(point p1point p2){
double x=(p2.x-p1.x);

double y=(p2.y-p1.y);
return sqrt(x*x+y*y);
}
int dist2(point p1point p2){

double x=p2.getx()-p1.getx();
double y=p2.gety()-p1.gety();
return sqrt(x*x+y*y);
}
void main()
{
point p1(25)p2(420);

cout<<dist1(p1p2)<<endl;

cout<<dist2(p1p2)<<endl;

}

为什么dist2这个函数没有声明为友元函数,却也能正常运行?

解决方案

xy不是成员变量 x y,而是局部变量。两者不是一回事。

解决方案二:
一楼的前辈,dist2中也有x,y啊?

解决方案三:
因为getx gety是公有函数,所以本来就能访问,不需要友元。

解决方案四:
如果你写
double x=(p2.x-p1.x);
那么肯定不能编译

解决方案五:
dist2只需p1p2对它公开,getxgety是p1p2的事。你可以反问一下,如果这样都不能访问类的私有成员变量,怎么才能访问?都定义友元来访问吗,那面向的封装特性还剩多少?

时间: 2024-10-01 11:39:31

关于友元函数没声明也能运行的问题的相关文章

C++之:友元函数

一.定义 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: friend 类型 函数名(形式参数); 友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员.c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密. 友元的正确使用能提高程

C++学习摘要之六:友元函数与友元类

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为 公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分,但 又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数.除了友元函数外,还有 友元类,两者统称为友元.友元的作用是提供了工序的运行效率,但又破坏了类的封装性. 1.友元函数 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类 ,但需要在类的定义中加以声明,声明时

C++友元函数与拷贝构造函数详解_C 语言

一.友元函数 1.友元函数概述: (1)友元函数是定义在一个类外的普通函数. 友元函数和普通函数的定义一样;在类内必须将该普通函数声明为友元. (2)友元函数不是成员函数. 不能通过对象来调用,而是直接调用;友元函数可以访问类的公有.受保护以及私有成员,但是必须通过对象.对象指针或者对象引用来访问. 2.友元函数的声明: friend 返回值类型 函数名(参数表); 在类中只需要将这个声明放置在公有部分即可. class Point { double x, y; public: Point(){

解析C++中不能重载为友元函数的四个运算符

以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下   C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢? 现在先说说赋值运算符"="的重载 C++规定赋值运算符"="只能重载为类的非静态成员函数,而不可以重载为类的友元函数. 不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员.而赋值运算符

c++-类的友元函数是命名空间的成员吗?

问题描述 类的友元函数是命名空间的成员吗? 在一个名称空间里面声明了一个类,在名称空间外定义,在这个类里面声明了一个友元函数,那么这个友元函数是不是原来名称空间的成员? 因为我实现这个友元的时候没有加命名空间限定,它自己认为自己是名称空间里的成员. 另外(与上无关),类的友元函数是不用事先声明的吧,现在类写到这了,需要友元,我就声明个友元,然后在类后面实现它就好了,是这样吗?或者我也可以事先声明,在类前声明,在类里加friend,类后再实现也是可以的是吗? 解决方案 看友元函数自己的定义,放在命

C++友元函数实现

友元函数是一种特殊的函数,它必须要在类中进行声明,但其本身并不是类的成员函数,但友元函数可以访问类的私有成员变量. 友元函数的好处: 1.实现类之间的数据共享 2.提高程序运行效率,方便编程 友元函数的坏处: 1.破坏数据的隐蔽性和类的封装性 2.降低了程序的可维护性 所有,友元函数应当谨慎的去使用它. 实例: #include <iostream> #include <cstring> using namespace std ; class Student { private :

简要介绍C++编程中的友元函数和友元类_C 语言

一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来补充介绍一个例外--友元(friend). fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些.有的家庭可能会这样处理:客厅对所有来客开放,而卧室除了本家庭的成员可以进人以外,还允许好朋友进入.在C++中,这种关系以关键宇 friend 声明,中文多译为友元.友元可以访问与其有好友关系的类

(一二二)友元函数

由于C++控制了对类对象的访问(例如不允许访问私有成员).于是,通常公有类方法(例如:成员函数)提供唯一的访问途径.   这样保护了私有成员,但同时又因为这种限制太严格,以致于不适合特定的编程问题.   在这种情况下,C++提供了另外一种形式的访问权限:友元.     友元有三种: ①友元函数: ②友元类: ③友元成员函数.       通过让函数成为类的友元,可以赋予该函数与类的成员函数具有相同的访问权限(例如可以访问.修改私有成员).   为什么需要友元函数: 以类成员函数为例: Skill

C语言中函数的声明、定义及使用的入门教程_C 语言

对函数的"定义"和"声明"不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体.--谭浩强 ,<C程序设计>(第四版),清华大学出版社,2010年6月,p182 这段论述包含了许多概念性错误,这