zoukankan      html  css  js  c++  java
  • 友元的尴尬能力

    实际工程开发逐渐被遗弃;

    什么是友元?

    - 友元是C++ 中的一种关系;

    -友元关系发生在函数与类之间或者类与类之间;

    -友元是单项的,不能传递。

    函数————》(友元)————》class;

    友元的用法:

    -在类中以friend 关键字声明友元

    -类的友元可以是其它类或者具体的函数

    -友元不是类的一部分

    -友元不受类中访问级别的限制

    -友元可以直接访问具体类中的所以的成员

    友元不受的priv限制,可以访问全体成员,它是外部的实体,不受类的限制

    -在类中,用 friend 关键字对函数进行声明。

     1 #include <stdio.h>
     2 #include <math.h>
     3 
     4 class Point
     5 {
     6     double x;
     7     double y;
     8 public:
     9     Point(double x, double y)
    10     {
    11         this->x = x;
    12         this->y = y;
    13     }
    14     
    15     double getX()
    16     {
    17         return x;
    18     }
    19     
    20     double getY()
    21     {
    22         return y;
    23     }
    24        
    25     friend double func(Point& p1, Point& p2);
    26 };
    27 
    28 double func(Point& p1, Point& p2)
    29 {
    30     double ret = 0;
    31     
    32     ret = (p2.y - p1.y) * (p2.y - p1.y) +
    33           (p2.x - p1.x) * (p2.x - p1.x);
    34           
    35     ret = sqrt(ret);
    36     
    37     return ret;
    38 }
    39 
    40 int main()
    41 {
    42     Point p1(1, 2);
    43     Point p2(10, 20);
    44     
    45     printf("p1(%f, %f)
    ", p1.getX(), p1.getY());
    46     printf("p2(%f, %f)
    ", p2.getX(), p2.getY());
    47     printf("|(p1, p2)| = %f
    ", func(p1, p2));
    48     
    49     
    50     return 0;
    51 }

    友元的尴尬能力:

    -友元是为了兼顾C的高效而诞生的;

    -友元直接破坏了面向对象的封装性;

    -友元在实际产品中的高效是得不偿失的;

    -友元在现代工程中已经被逐渐遗弃。

    注意事项:

    -友元不具有传递性;

    -类的友元可以是其他类的成员函数

    -类的友元可以是某个完整的类;

       -所有的成员函数都是友元。


    友元不具有传递性.cpp:

     1 #include <stdio.h>
     2 
     3 class ClassC
     4 {
     5     const char* n;
     6 public:
     7     ClassC(const char* n)
     8     {
     9         this->n = n;
    10     }
    11     
    12     friend class ClassB;
    13 };
    14 
    15 class ClassB
    16 {
    17     const char* n;
    18 public:
    19     ClassB(const char* n)
    20     {
    21         this->n = n;
    22     }
    23     
    24     void getClassCName(ClassC& c)
    25     {
    26         printf("c.n = %s
    ", c.n);
    27     }
    28     
    29     friend class ClassA;
    30 };
    31 
    32 class ClassA
    33 {
    34     const char* n;
    35 public:
    36     ClassA(const char* n)
    37     {
    38         this->n = n;
    39     }
    40     
    41     void getClassBName(ClassB& b)
    42     {
    43         printf("b.n = %s
    ", b.n);
    44     }
    45     /*
    46     void getClassCName(ClassC& c)
    47     {
    48         printf("c.n = %s
    ", c.n);
    49     }
    50     */
    51 };
    52 
    53 int main()
    54 {
    55     ClassA A("A");
    56     ClassB B("B");
    57     ClassC C("C");
    58     
    59     A.getClassBName(B);
    60     B.getClassCName(C);
    61     
    62     return 0;
    63 }
  • 相关阅读:
    拖动内容,滚动条滚动,横向
    前端面试题及答案整理(一)
    微软拼音转换工具类ChnCharInfo.dll
    table表格,让thead固定,tbody有滚动条,关键是都对齐的纯css写法。
    [C#]_[使用微软OpenXmlSDK (OpenXmlReader)读取xlsx表格] 读取大数据量100万条数据Excel文件解决方案
    asp.net mvc Post上传文件大小限制
    .net OADate 转javascript的Datetime js 5位 日期 转换
    在.NET开发中的单元测试工具之(1)——NUnit
    在.NET开发中的单元测试工具之(2)——xUnit.Net
    Git 头像修改 原
  • 原文地址:https://www.cnblogs.com/lemaden/p/10117792.html
Copyright © 2011-2022 走看看