本文小编为大家详细介绍“C++友元如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++友元如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
什么是友元?
友元是 C++ 中的一种关系
友元关系发生在函数与类之间或者类与类之间
友元关系是单项的,不能传递
在类中以 friend 关键字声明友元
类的友元可以是其它类或者具体函数
友元不是类的一部分
友元不受类中访问级别的限制
友元可以直接访问具体类的所有成员
在类中用 friend 关键字对函数或类进行声明
先看一个不使用友元的代码:
#include <stdio.h>
#include <math.h>
class Point
{
double x;
double y;
public:
Point(double x, double y)
{
this->x = x;
this->y = y;
}
double getX()
{
return x;
}
double getY()
{
return y;
}
//friend double func(Point& p1, Point& p2);
};
double func(Point& p1, Point& p2)
{
double ret = 0;
ret = (p2.getY() - p1.getY()) * (p2.getY() - p1.getY()) +
(p2.getX() - p1.getX()) * (p2.getX() - p1.getX());
ret = sqrt(ret);
return ret;
}
int main()
{
Point p1(1, 2);
Point p2(10, 20);
printf("p1(%f, %f)\n", p1.getX(), p1.getY());
printf("p2(%f, %f)\n", p2.getX(), p2.getY());
printf("|(p1, p2)| = %f\n", func(p1, p2));
return 0;
}
输出结果如下:
这个程序在x 和 y中计算两点之间的距离时需要频繁访问私有成员 x 和 y,所以不得不调用getX() 和getY() 来访问x 和 y,x 和 y 函数中调用了 8 次getX() 和getY(),很麻烦。
这个时候,就该我们的友元上场了:
#include <stdio.h>
#include <math.h>
class Point
{
double x;
double y;
public:
Point(double x, double y)
{
this->x = x;
this->y = y;
}
double getX()
{
return x;
}
double getY()
{
return y;
}
friend double func(Point& p1, Point& p2);
};
double func(Point& p1, Point& p2)
{
double ret = 0;
ret = (p2.y - p1.y) * (p2.y - p1.y) +
(p2.x - p1.x) * (p2.x - p1.x);
ret = sqrt(ret);
return ret;
}
int main()
{
Point p1(1, 2);
Point p2(10, 20);
printf("p1(%f, %f)\n", p1.getX(), p1.getY());
printf("p2(%f, %f)\n", p2.getX(), p2.getY());
printf("|(p1, p2)| = %f\n", func(p1, p2));
return 0;
}
输出结果如下:
友元是为了兼顾 C 语言的高效而诞生的
友元直接破坏了面向对象的封装性
友元在实际产品中的高效是得不偿失的
友元在现代软件工程中已经逐渐被遗弃
友元关系不具备传递性
类的友元可以是其它类的成员函数
类的友元可以是某个完整的类
所有的成员函数都是友元
下面来深入分析一下友元:
#include <stdio.h>
class ClassC
{
const char* n;
public:
ClassC(const char* n)
{
this->n = n;
}
friend class ClassB;
};
class ClassB
{
const char* n;
public:
ClassB(const char* n)
{
this->n = n;
}
void getClassCName(ClassC& c)
{
printf("c.n = %s\n", c.n);
}
friend class ClassA;
};
class ClassA
{
const char* n;
public:
ClassA(const char* n)
{
this->n = n;
}
void getClassBName(ClassB& b)
{
printf("b.n = %s\n", b.n);
}
/*
void getClassCName(ClassC& c)
{
printf("c.n = %s\n", c.n);
}
*/
};
int main()
{
ClassA A("A");
ClassB B("B");
ClassC C("C");
A.getClassBName(B);
B.getClassCName(C);
return 0;
}
B 是 C 的友元,A 是 B 的友元,输出结果如下:
既然 A 可以访问 B,B 可以访问 C,那么 A 可以访问 C 么?把上面代码取消注释:
void getClassCName(ClassC& c)
{
printf("c.n = %s\n", c.n);
}
输出报错,这说明友元关系不具备传递性
读到这里,这篇“C++友元如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。