iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中友元是什么意思
  • 812
分享到

C++中友元是什么意思

2023-06-29 10:06:33 812人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关c++中友元是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.友元函数友元函数可以是普通函数或者类成员函数。先看普通函数声明为友元函数:如下所示:#include&n

这篇文章将为大家详细讲解有关c++中友元是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    一.友元函数

    友元函数可以是普通函数或者类成员函数。

    先看普通函数声明为友元函数:

    如下所示:

    #include <iOStream>#include <cmath>using namespace std;class Point{    //普通函数声明为类的友元函数friend double TwoPointsDistant(const Point& pnt1, const Point& pnt2);public:Point(double x=0, double y=0):_x(x), _y(y){}double getPointXAxis() const { return this->_x; }double getPointYAxis() const { return this->_y; }private:double _x;double _y;};//计算两点的距离double TwoPointsDistant(const Point& pnt1, const Point& pnt2){return sqrt(  pow((pnt1._x - pnt2._x), 2) + pow((pnt1._y - pnt2._y), 2)   );}int main(){Point point1(1.1,2.2);Point point2(3.3, 4.4);cout << TwoPointsDistant(point1, point2) << endl;system("pause");return 0;}

    这里说明一点:TwoPointsDistant()函数必须在Point类的定义下面,至于原因,很简单,你若放在Point上面,Point的数据成员_x和_y都没定义呢,你用个锤子。

    再看类成员函数声明为友元函数:

    还以上面的类为例,现在加一个_PointMove_类,它有一个成员函数_PointAxisAddOne,_作用是将点的坐标都加1。如下:

    class PointMove{public:void PointAxisAddOne(Point& pnt);};

    这里就出现了一个问题:_Point_和_PointMove_哪个放在前面?先给出答案,应该把_PointMove_放在前面,并且是必须的,如下:

    class Point;//前向声明Pointclass PointMove{public:void PointAxisAddOne(Point& pnt);};class Point{    //普通函数声明为类的友元函数friend double TwoPointsDistant(const Point& pnt1, const Point& pnt2);    //类成员函数声明为友元friend void PointMove::PointAxisAddOne(Point& pnt);    };//类成员函数的定义void PointMove::PointAxisAddOne(Point& pnt){pnt._x = pnt._x + 1;pnt._y = pnt._y + 1;}

    这里注意,对于类的成员函数,声明为其他类的友元函数时需要加上类的作用域,即指出该函数属于哪个类。如上面的_PointMove::_。

    同时,需要说明的是,PointAxisAddOne()函数的定义是必须放在Point类定义后面的,这和普通函数的道理是一样的。

    最后说明

    一个函数Func被声明为类A的友元函数,那么是不能直接使用this指针来访问类A的数据成员的(当然,若Func是类B的成员函数,它可以通过this访问类B的数据成员),这和成员函数不同。

    一个函数Func为什么要声明为某个类A的友元,就是因为函数的参数类型为类A类型,我想访问这个类对象的数据成员,所以被声明为类A的友元函数的参数类型必定为类A,如friend Func(A& obj);

    二.友元类

    若是将一个类C都声明为另一个类A的友元类,则类C中的成员函数均可访问类A中的私有数据成员。如下:

    class Point{    //友元类    friend class PointInfo;    ...}class PointInfo{public://打印点所处象限void PrintQuadrant(const Point& pnt) const{if (pnt._x > 0 && pnt._y > 0)cout << "点"<<"(" << pnt._x << "," << pnt._y<<")" <<"处于第一象限" << endl;}};

    当然,你也可以把_PointInfo_写在_Point_前,只是函数_PrintQuadrant()_的定义就不能在类内实现了,只能在_Point_后实现,原因和前面一样,不再赘述。

    三.完整示例:

    #include <iostream>#include <cmath>using namespace std;class Point;class PointMove{public:void PointAxisAddOne(Point& pnt);};class PointInfo{public://打印点所处象限void PrintQuadrant(const Point& pnt) const;};class Point{friend class PointInfo;friend double TwoPointsDistant(const Point& pnt1, const Point& pnt2);friend void PointMove::PointAxisAddOne(Point& pnt);public:Point(double x=0, double y=0):_x(x), _y(y){}double getPointXAxis() const { return this->_x; }double getPointYAxis() const { return this->_y; }void PrintAxis(const Point& pnt) const{}private:double _x;double _y;};//打印点所处象限void PointInfo::PrintQuadrant(const Point& pnt) const{if (pnt._x > 0 && pnt._y > 0)cout << "点"<<"(" << pnt._x << "," << pnt._y<<")" <<"处于第一象限" << endl;}void PointMove::PointAxisAddOne(Point& pnt){pnt._x = pnt._x + 1;pnt._y = pnt._y + 1;}double TwoPointsDistant(const Point& pnt1, const Point& pnt2){return sqrt(  pow((pnt1._x - pnt2._x), 2) + pow((pnt1._y - pnt2._y), 2)   );}int main(){Point point1(1.1,2.2);Point point2(3.3, 4.4);cout << TwoPointsDistant(point1, point2) << endl;PointInfo pf;pf.PrintQuadrant(point1);system("pause");return 0;}

    VS2015打印结果:

    C++中友元是什么意思

    四.同一个类(class)的类对象(object)互为友元

    还以上面给出的例子为基础,现在在_Point_类加一个成员函数func(const Point& pnt),它返回点的x轴和y轴的和。如下所示。

    class Point{    double func(const Point& pnt){return pnt._x + pnt._y;}private:double _x;double _y;};

    现在我生成两个对象,并作如下操作:

    Point point1(1.1,2.2);Point point2(3.3, 4.4);cout << point1.func(point2) << endl;

    最后的结果是打印出7.7。看到这里不知道你有没有疑问:为什么可以通过point1直接访问point2的私有数据成员,而没有将func()声明为友元函数?侯捷老师是这么解释的:相同class的各个objects之间互为友元。

    所以对于一个类A,若有一个成员函数Fun(A& arg),可以通过arg直接访问A的私有数据成员。

    关于“C++中友元是什么意思”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: C++中友元是什么意思

    本文链接: https://www.lsjlt.com/news/324241.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C++中友元是什么意思
      这篇文章将为大家详细讲解有关C++中友元是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.友元函数友元函数可以是普通函数或者类成员函数。先看普通函数声明为友元函数:如下所示:#include&n...
      99+
      2023-06-29
    • C++中类的友元机制是什么
      这篇文章主要为大家详细介绍了C++中类的友元机制是什么,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:类的友元  友元是C++提供的一种破坏数据封装和数据隐藏的机制。  通过将一个模块声明为另一个模块的友元,一...
      99+
      2023-06-06
    • c++中%是什么意思
      c++ 中 % 表示取模运算,它计算两个整数之间的余数,语法为 result = a % b,其中 a 和 b 为整数,result 为 a 除以 b 时的余数。此外,百分号还用于流格式...
      99+
      2024-04-26
      c++
    • c++中//是什么意思
      bloc++k||||||||block C++ 中的 // 在 C++ 中,"//" 符号表示单行注释的开始,而该行的剩余部分则被视为注释。注释不会被编译器处理,并且仅用于为代码提供...
      99+
      2024-04-26
      c++
    • c++中→是什么意思
      c++ 中的箭头运算符(->)用于访问对象成员,它将一个指针和一个成员名称结合起来,以访问该成员,等价于点运算符 (.),但要求对象必须通过指针访问。 C++ 中的箭头运算符 (...
      99+
      2024-04-28
      c++
    • c++中$是什么意思
      在 c++ 中,$ 符号用于:字符串化宏:将宏参数转换为字符串形式,格式为 #define str(x) #xstr(hello),结果为 "hello" 字符串常量。异常处理:在 ca...
      99+
      2024-04-28
      c++ 字符串常量
    • c#中+=是什么意思
      c# 中的+=运算符用于将一个值添加到现有的变量或属性中。它等同于将值赋给该变量或属性,然后再添加一个值。此运算符适用于数值类型,用于逐个更新值、累加或简化代码。 C#中的+=运算符 ...
      99+
      2024-05-10
      c#
    • c++中|是什么意思
      按位或(|)运算符将二进制数字的每一位进行或运算:如果两者的某一位都是 1,则结果中该位为 1;如果两者的某一位有一个是 0,则结果中该位为 0。它用于:提取位设置位清除位测试位 C+...
      99+
      2024-04-26
      c++
    • c++中' '是什么意思
      bloc++k||||||||block C++ 中的 '' 是什么? C++ 中的 '' 表示空字符。 具体解释: 空字符是一个没有打印效果的字符,它在 C++ 中用一对单引号表示。...
      99+
      2024-04-26
      c++ 格式化输出 字符串数组
    • c++中+=是什么意思
      c++ 中 += 运算符是复合赋值运算符,用于将一个值加到现有变量上,语法为 variable += expression,其等价赋值形式为 variable = variable + ...
      99+
      2024-04-26
      c++
    • c#中//是什么意思
      在 c# 中,// 表示单行注释,用于添加不影响代码运行的附加信息。语法为:// 注释内容。不同于多行注释 (/ 多行注释内容 /),单行注释只适用于一行,并提供有关代码片段、变量、方法...
      99+
      2024-05-10
      c#
    • c++中/*是什么意思
      在 c++ 中,“/”和“/”是多行注释符号,用于注释掉代码块,使其不会被编译器执行。具体用法包括: 标记注释的结束。注释的内容可以是多行文本,无需以分号 (;) 结尾。 C++ 中 ...
      99+
      2024-04-26
      c++
    • c++中*=是什么意思
      = 运算符用于将变量乘以另一个值并存储在该变量中,等价于 variable = variable expression。语法:variable = expression。优点:简洁,提...
      99+
      2024-04-26
      c++
    • c++中!=是什么意思
      c++ 中的 != 是一个二元运算符,表示 "不等于"。它用于比较两个表达式是否不相等,不同则返回 true,否则返回 false。语法为 expression1 != expressi...
      99+
      2024-04-26
      c++
    • c++中||是什么意思
      || 是 c++ 中的逻辑 or 运算符,用于连接两个布尔值。它计算结果:bool_expression1 为 true 则为 true,bool_expression1 为 false...
      99+
      2024-04-26
      c++
    • c++中==是什么意思
      在 c++ 中,== 运算符用于比较两个表达式的值是否相等,如果相等则返回 true,否则返回 false。它支持不同数据类型的比较,并会进行自动类型转换以方便比较。但要注意不要与赋值运...
      99+
      2024-05-01
      c++ 隐式转换
    • c#中??是什么意思
      c#中的操作符(空合并操作符)为null操作数提供备用值:检查操作数x是否为null。如果x不为null,返回x的值。如果x为null,返回备用值表达式y。 C# 中的 操作符 C#...
      99+
      2024-05-10
      c# 代码可读性
    • c++中的/=是什么意思
      c++ 中 /= 运算符用于将变量除以某个值并将其结果存储回变量本身,这等效于执行 variable = variable / expression。 C++ 中 /= 的含义 在 C...
      99+
      2024-05-01
      c++
    • c++中i--是什么意思
      c++ 中的 i-- 运算符执行后置减法操作,先将 i 的值分配给一个临时变量,减 1 后更新 i 的值。这与前置减法操作符 (i--) 不同,前者在减 1 之前会先更新 i 的值。 ...
      99+
      2024-05-01
      c++
    • c++中\n是什么意思
      c++ 中的 \n 是换行符,用于在文本输出中强制换行。它可以以 \n 转义字符或 std::endl 内联使用,都可以将文本换行到新的一行。 C++ 中的 \n 什么是 \n? 在 ...
      99+
      2024-05-01
      c++
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作