【C++】C++友元

C++中可以使用friend关键字来将函数、类声明为某个类的友元
友元包括友元函数和友元类
友元具有一些特权,可以访问private的成员
友元只能授予,不能索取,单向,不能传递(比如a是b的友元,b是c的友元,但a不是c的友元)

友元函数

在类体中使用friend关键字对友元函数进行声明:
将非成员函数/一般函数声明为友元:
friend void func(); //func为非成员函数,不属于任何类
将其他类的成员函数声明为友元:
friend void CTime::getNum();//getNum为CTime类的成员。

友元类

在类体中使用friend关键字将某类声明为自己的友元类。
friend CTime;

好处就是方便,可以在其他类或方法直接访问私有成员

缺点:
面向对象的基本原则包括封装性和信息隐藏,而由于友元可以访问其他类的私有成员,这是对封装原则的一个破坏。因此使用友元的时候要特别慎重。

实例

#ifndef TIME_H
#define TIME_H
#include "Date.h"
class CTime
{
public:
    CTime();
    CTime(int hour, int minute, int second = 0);
    CTime(int value);
    CTime(CTime& time);
    ~CTime();
    void setHour(int hour);
    void setMinute(int minute);
    void setSecond(int second);

    int getHour();
    int getMinute();
    int getSecond(); 

    int getNum() const;

    //friend CDate;//声明友元类,需要声明class CDate;    这样整个类都可以访问CTime的私有成员的了,由于我们只在disPlay函数中访问,所以可以用下面的方法
    friend void CDate::disPlay(const CTime& time);
    friend void func();//告诉编译器,CTime这个类,已经将func()这个函数声明为自己的友元函数,这个声明可以放在本CTime类中任何地方
private:
    int m_nHour;
    int m_nMinute;
    int m_nSecond;
    const int m_nNum;
};

#endif
#ifndef DATA_H
#define DATA_H

class CTime;//类的前置声明,一般情况下,是需要声明之后才可以使用的

class CDate
{
public:
    CDate(int year, int month, int day);

    //friend CTime;//在这里声明友元没用,因为友元只能授予,不能索取!
    void disPlay(const CTime& time);//使用的是类的引用(引用也是使用指针来实现的),这里不声明是可以的

private:
    int m_nYear;
    int m_nMonth;
    int m_nDay;

};
#endif

main.cpp

#include<iostream>
#include"Time.h"
#include "Date.h"
using namespace std;

void func()
{
    CTime time(1,1,1);
    time.m_nHour = 3;
    cout << time.m_nHour << endl;
}

int main()
{
    const CTime time(10,50,20);
    CTime const time2;
    std::cout << time.getNum() << std::endl;
    func();

    CDate date(2015, 1, 26);
    date.disPlay(time);

    getchar();
    return 0;
}

演示结果

源代码下载地址:

GITHUB源码下载地址:点我进行下载

本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn

本文源自人生之旅_谙忆的博客

时间: 2024-09-26 20:01:28

【C++】C++友元的相关文章

c++ 重载操作符友元问题

问题描述 c++ 重载操作符友元问题 <c++ primer>里面有一段文字: Salesitem 类也是说明为何有些操作符需要设置为友元的一个好例子.它定义了一个成员操作符,并且有三个非成员操作符.这些非成员操作符需要访问私有数据成员,声明为友元: class Sales_item {friend std::istream& operator>>(std::istream& Sales_item&);friend std::ostream& ope

C++友元

类的提前声明 回忆函数的原型声明 #include <iostream> using std::cout; using std::endl; void test(); int main() { test(); return 0; } void test() { cout << "函数的提前声明!" << endl; } 类和函数也是类似的,有时也需要提前声明 class B; //提前声明 class A { //class B }; int mai

C++中类模板(class template)友元(friend) 的全部六种形式

类模板(class template)的友元(friend)和普通类的友元, 有很多区别, 主要原因是类模板包含模板参数(template parameter), 就会导致友元和类模板有很多匹配形式; 主要包含六种形式: 1. 类 - 友元(friend): "模板参数是当前类"的类模板; 2. 类 - 友元: "模板参数任意"的模板类; 3. 模板类 - 友元: "模板参数相同"的模板类; 4. 模板类 - 友元: "模板参数任意&q

C++:模板函数需要类型转换时使用友元(friend)模板函数

模板函数的隐式(implicit)类型转换, 涉及到模板参数(typename)的确定问题. 从int或double类型, 无法隐式转换为模板类(template class)的类型, 因为无法确定模板参数类型(typename), 就无法确定构造函数的参数. 所以需要使模板函数, 与模板类拥有相同的参数类型(typename), 则需要成为模板类的友元(friend). 模板类的友元, 会随着类的参数实例化, 而实例化参数类型, 从一个函数模板, 生成定制的函数, 即可以通过隐式类型转换. 因

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

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

C++友元入门教程

在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点: 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全. 友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,

C++运算符重载 成员函数与友元函数详解

以下是对C++运算符重载 成员函数与友元函数进行了介绍,需要的朋友可以过来参考下   复制代码 代码如下: #include<iostream> using namespace std; class A {     int x,y;     public:     A(int xx,int yy):x(xx),y(yy){}     A(){x=0;y=0;}     A operator+(const A&b) //不加const限定,也可以     { return A(x+b.x

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

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

c++-C++ 如何提供独立的友元的函数声明?

问题描述 C++ 如何提供独立的友元的函数声明? <C++ Primer>第五版,中文版.242 页. 能不能给个例子?看书上的描述看不明白. 解决方案 在类申明里加上friend申明函数,在类外面定义函数.http://blog.chinaunix.net/uid-790245-id-2037327.html 解决方案二: 大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 优点:能够提高效率,表达简单.清晰. 缺点:友元函数破环了封装

解决友元类(friend class)无法继承的问题

解决友元类(friend class)无法继承的问题   友元声明friend class是无法继承的.举例说明:class A声明class B为其友元类,也就是说class A授予class B访问class A的所有包括私有成员在内的所有成员.如果class C 继承class B.那么class C是不具备这种特权的.     但是如果我想在class C中访问class A的某个私有或者保护成员函数怎么办? 我们可以把工作交给父类.   #include <iostream> usi