`
anson_xu
  • 浏览: 514741 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作

 
阅读更多

<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->

C++友元friend --c++ 利用friend 修饰符,可以让一些你设定的函数能够对这些保护数据进行操作

分类: C++ 知识点回顾 2008-10-06 11:24 7642 人阅读 评论 (0) 收藏 举报

通常对于普通函数来说, 要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public( 共用的) ,然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++ 利用friend 修饰符,可以让一些你设定的函数能够对这些保护数据进行操作 避免把类成员全部设置成public ,最大限度的保护数据成员的安全

   友元能够使得普通函数直接访问类的保护数据 ,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但矛盾的是,即使是最大限度的保护,同样也破坏了类的封装特性,这即是友元的缺点 ,在现在cpu 速度越来越快的今天我们并不推荐使用它,但它作为c++ 一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。

 

1. 在类里声明一个普通函数,在前面加上friend 修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。

   下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的。

#include <iostream >   
using  namespace  std; 
class  Internet   
{   
public :   
    Internet(char  *name,char  *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);    
    } 
friend  void  ShowN(Internet &obj);//
友元函数的声明 
public :   
    char  name[20]; 
    char  address[20]; 
}; 
 
 
void  ShowN(Internet &obj)//
函数定义, 不能写成,void Internet::ShowN(Internet &obj) 

    cout <<obj.name<<endl; 

void  main ()   

    Internet a("
中国软件开发实验室","www.cndev-lab.com"); 
    ShowN(a); 
    cin .get(); 
}

  上面的代码通过友元函数的定义,我们成功的访问到了a 对象的保护成员name, 友元函数并不能看做是类的成员函数,它只是个被声明为类友元的普 通函数,所以在类外部函数的定义部分不能够写成void Internet::ShowN(Internet &obj) ,这一点要注意。

  

2. 一个普通函数可以是多个类的友元函数 ,对上面的代码我们进行修改,注意观察变化:

#include <iostream >   
using  namespace  std; 
class  Country; 
class  Internet   
{   
public :   
    Internet(char  *name,char  *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);    
    } 
friend  void  ShowN(Internet &obj,Country &cn);//
注意这里 
public :   
    char  name[20]; 
    char  address[20]; 
}; 
 
class  Country 

public
    Country() 
    { 
        strcpy(cname,"
中国"); 
    } 
friend  void  ShowN(Internet &obj,Country &cn);//
注意这里 
protected
    char  cname[30]; 
}; 
 
void  ShowN(Internet &obj,Country &cn) 

    cout <<cn.cname<<"|"<<obj.name<<endl; 

void  main ()   

    Internet a("
中国软件开发实验室","www.cndev-lab.com"); 
    Country b; 
    ShowN(a,b); 
    cin .get(); 
}

 

3 一个类的成员函数函数也可以是另一个类的友元 从而可以使得一个类的成员函数可以操作另一个类的数据成员,我们在下面的代码中增加一类Country ,注意观察:

#include <iostream >   
using  namespace  std; 
class  Internet; 
 
class  Country 

public
    Country() 
    { 
        strcpy(cname,"
中国"); 
    } 
    void  Editurl(Internet &temp);//
成员函数的声明 
protected
    char  cname[30]; 
}; 
class  Internet 
{   
public :   
    Internet(char  *name,char  *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);  
    } 
    friend  void  Country::Editurl(Internet &temp);//
友元函数的声明 
protected :   
    char  name[20]; 
    char  address[20]; 
}; 
void  Country::Editurl(Internet &temp)//
成员函数的外部定义 

    strcpy(temp.address,"edu.cndev-lab.com"); 
    cout <<temp.name<<"|"<<temp.address<<endl; 

void  main () 

    Internet a("
中国软件开发实验室","www.cndev-lab.com"); 
    Country b; 
    b.Editurl(a); 
    cin .get(); 
}

 

4. 整个类也可以是另一个类的友元 ,该友元也可以称做为友类 。友类的每个成员函数都可以访问另一个类的所有成员。
  示例代码如下:

#include <iostream >   
using  namespace  std; 
class  Internet; 
 
class  Country 

public
    Country() 
    { 
        strcpy(cname,"
中国"); 
    } 
    friend  class  Internet;//
友类的声明 
protected
    char  cname[30]; 
}; 
class  Internet 

public :   
    Internet(char  *name,char  *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);  
    } 
    void  Editcname(Country &temp); 
protected :   
    char  name[20]; 
    char  address[20]; 
}; 
void  Internet::Editcname(Country &temp) 

    strcpy(temp.cname,"
中华人民共和国");  

void  main () 

    Internet a("
中国软件开发实验室","www.cndev-lab.com"); 
    Country b; 
    a.Editcname(b); 
    cin .get(); 
}

  在上面的代码中我们成功的通过InternetEditcname 成员函数操作了Country 类的保护成员cname

   在编程中,我们使用友元的另外一个重要原因是为了方便重载操作符的使用 ,这些内容我们将在后面的教程着重讨论!

 

分享到:
评论

相关推荐

    C++友元类调用实例详解

    C++友元类调用实例详解 在 C++ 编程语言中,友元类(Friend Class)是一种特殊的类关系,允许一个类访问另一个类的私有成员和保护成员。本文将详细解释友元类的调用实例,包括友元类的定义、继承关系、成员访问控制...

    剖析C++编程中friend关键字所修饰的友元函数和友元类

    在类声明中,使用 friend 关键字和非成员函数名称或其他类,以允许其访问你的类的专用和受保护成员。 语法 friend class-name; friend function-declarator; 友元声明 如果声明以前未声明的友元函数,则该函数将...

    C++中的函数修饰符深入讲解

    8. **友元(friend)**:`friend`关键字让函数成为类的友元,可以访问类的私有和受保护成员。 9. **常量表达式(constexpr)**:C++11引入,指示函数返回的结果是一个常量表达式,即编译时常量。 ### 函数名后的...

    2022年计算机二级C++复习资料:私有数据成员和友元.docx

    友元(Friend)是C++中的一个特性,允许类的私有或受保护成员对其他类或函数开放。友元可以是类的成员函数或者非成员函数。友元函数可以访问声明它的类的私有和受保护成员,即使它不是该类的成员。 1. 友元类:一个...

    C++关键字和操作符替代名

    29. **friend**:声明友元函数或类。 30. **goto**:无条件跳转到标记位置。 31. **if**:if语句的关键字。 32. **inline**:建议编译器内联函数。 33. **int**:整型。 34. **long**:长整型。 35. **...

    C++基础考试.pdf

    以下是对C++基础的一些详细解释: 1. 类和对象: - 类是一种抽象的数据类型,它定义了一组数据成员(变量)和成员函数(方法),用于封装数据和操作。 - 对象是类的具体实例,它包含类中定义的成员变量和成员函数...

    C++类的练习_c++类综合练习_C++_c++类练习_

    在这个"C++类的练习"主题中,我们将深入探讨类的基本构造、成员变量、成员函数、访问修饰符、构造函数、析构函数、对象的创建与销毁、友元函数、继承、多态等关键知识点。 1. **类的定义与声明**:类是用来定义对象...

    c++面向对象程序设计(第6版)Walter Savitch 书中的 c++题库

    《C++面向对象程序设计(第6版)》是由Walter Savitch...以上就是C++面向对象编程的一些核心概念,通过《C++面向对象程序设计(第6版)》的配套题库,你可以针对这些知识点进行深入的练习和理解,提升你的C++编程技能。

    C++面向对象实验代码实验2

    10. 友元(Friend):友元函数或友元类可以访问类的私有和保护成员,`test2`中可能涉及到友元的使用,以解决特定的访问控制问题。 这个实验代码`test2`提供了一个实践C++面向对象编程的平台,通过分析和运行这些...

    c++ 类基本概念易错点

    在C++编程语言中,类(Class)是面向对象编程的核心元素,它定义了一组相关的数据和函数,这些数据和函数共同完成一个特定任务。理解类的基本概念对于编写高效的C++代码至关重要。以下是对C++类中一些易错点的详细...

    C++面向对象程序设计-电子教案

    - C++允许重载已有的运算符,使其能够对类对象进行操作,提高了代码的可读性。 8. **异常处理**: - 异常处理是C++中处理错误的一种方式,通过`try`、`catch`和`throw`关键字来捕获和处理运行时出现的错误。 9. ...

    C++ 类学习demo,及常用操作

    在C++编程语言中,"类"是面向对象编程的核心概念。它是一种用户自定义的数据类型,用于封装数据和操作这些数据的...通过不断的练习和实践,你可以更熟练地掌握类的各种操作,并利用它们构建出高效、可维护的C++程序。

    Visual C++ 面向对象与可视化程序设计 pdf

    - 友元(Friend):允许非成员函数或类访问另一个类的私有或受保护成员。 3. **Visual C++开发环境**: - IDE(Integrated Development Environment):集成了编辑器、编译器、调试器等工具,方便编写、编译和...

    c++面向对象程序设计课后习题解答

    6. **友元(Friend)**:友元函数或友元类可以访问另一个类的私有和保护成员,打破封装原则但有时有助于实现特定功能。声明友元需在类定义内使用`friend`关键字。 7. **静态成员**:静态成员属于类而不是类的任何...

    C++类访问权限.doc

    - 友元类(Friend classes)是整个类而不是类的某个成员成为另一个类的友元,这样类的所有成员函数都可以访问对方的私有和保护成员。 继承时访问权限的变化: - `private`继承:这种方式通常用来表示“is-a”关系...

    C++ 自考模拟试题

    - **修饰符**:静态数据成员可以用 `public`、`private` 和 `protected` 修饰。 ### 5. 构造函数的调用时机 - **调用时机**:构造函数仅在创建对象时被自动调用。 - **目的**:初始化对象的成员变量,并进行必要的...

    Deciphering Object-Oriented Programming with C++

    还有友元(Friend)函数和友元类,它们可以访问通常受保护的数据,虽然打破了封装性,但在某些情况下可以增加灵活性。 模板(Template)是C++中的一大特色,它允许创建泛型代码,可以在多种类型上工作,提高了代码...

    c++面相对象程序设计课件

    C++通过访问修饰符(如`public`、`private`和`protected`)实现封装,保护数据的安全性。 3. **继承**:继承允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为,实现代码的复用。在C++中,使用`:`...

    C++学生管理类

    - **类(Class)**:类是C++中定义数据结构和操作数据的方法,是创建对象的模板。在这个项目中,会有一个名为`Student`的类来表示学生,包含姓名、性别和学号等属性以及对这些属性的操作方法。 2. **数据成员...

    C++语言下的封装.zip

    4. **友元(Friend)**:有时需要打破封装原则,让非成员函数访问类的私有或受保护成员,这时可以声明该函数为友元。友元不是类的成员,但拥有访问类私有和受保护成员的权限。 5. **静态成员**:静态成员属于类本身...

Global site tag (gtag.js) - Google Analytics