不可或缺 Windows Native (20) - C++: 友元函数, 友元类

[源码下载]

作者:webabcd

介绍
不可或缺 Windows Native 之 C++

  • 友元函数
  • 友元类

示例
演示友元函数, 友元类
CppClass4.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
    class CppClass4
    {
    public:
        string Demo();
    };
}

CppClass4.cpp

/*
 * 友元(friend)函数, 友元类
 *
 * 友元函数: C++ 增加了一种称之为“友元(friend)”函数的声明,其用于将“特权”在本类中赋给一些函数(可以是全局函数,也可以是其它类的成员函数),使之能够访问本类的私有和保护成员
 * 友元类: 如果 B 类是 A 类的友元类,则 B 中的所有函数都是 A 的友元函数,即 B 可以访问 A 的所有私有和保护成员
 */

#include "pch.h"
#include "CppClass4.h"
#include "cppHelper.h"

using namespace NativeDll;

void cppclass4_demo1();
void cppclass4_demo2();
void cppclass4_demo3();

string CppClass4::Demo()
{
    // 全局函数作友元函数
    cppclass4_demo1();

    // 其它类的成员函数作友元函数
    cppclass4_demo2();

    // 友元类
    cppclass4_demo3();

    return "看代码及注释吧";
}

class CppClass4Demo1Time
{
public:
    CppClass4Demo1Time(int h, int m, int s)
    {
        _hour = h;
        _minute = m;
        _second = s;
    }

    // 友元函数声明:声明全局函数 string ShowTime(CppClass4Demo1Time &); 是我的友元函数
    friend string ShowTime(CppClass4Demo1Time &); // 前面加 friend

private:
    int _hour;
    int _minute;
    int _second;
};

// 之前声明过的,我是 CppClass4Demo1Time 类的友元函数,我可以使用 CppClass4Demo1Time 对象中的 private 和 protected 属性和函数
string ShowTime(CppClass4Demo1Time &t)
{
    t._hour = 10;
    return int2string(t._hour) + ":" + int2string(t._minute) + ":" + int2string(t._second);
}

// 全局函数作友元函数的演示
void cppclass4_demo1()
{
    CppClass4Demo1Time t(8, 30, 15);
    string result = ShowTime(t); // 10:30:15
}

class CppClass4Demo2Date;  // 对 CppClass4Demo2Date 类的提前引用声明
class CppClass4Demo2Time
{
public:
    CppClass4Demo2Time(int h, int m, int s)
    {
        _hour = h;
        _minute = m;
        _second = s;
    }

    // 我这里用到了 CppClass4Demo2Date 类,但是其是在后面定义的,所以在此之前要通过“class CppClass4Demo2Date;”做提前引用声明
    string ShowTime(CppClass4Demo2Date &d);

private:
    int _hour;
    int _minute;
    int _second;
};

class CppClass4Demo2Date
{
public:
    CppClass4Demo2Date(int y, int m, int d)
    {
        _year = y;
        _month = m;
        _day = d;
    }

    // 友元函数声明:声明 CppClass4Demo2Time 类中的 string ShowTime(CppClass4Demo2Date &); 是我的友元函数
    friend string CppClass4Demo2Time::ShowTime(CppClass4Demo2Date &);

private:
    int _year;
    int _month;
    int _day;

};

// 之前声明过的,我是 CppClass4Demo2Date 类的友元函数,我可以使用 CppClass4Demo2Date 对象中的 private 和 protected 属性和函数
string CppClass4Demo2Time::ShowTime(CppClass4Demo2Date &d)
{
    d._year = 2016;
    return int2string(d._year) + "-" + int2string(d._month) + "-" + int2string(d._day) + " " + int2string(_hour) + ":" + int2string(_minute) + ":" + int2string(_second);
}

// 其它类的成员函数作友元函数的演示
void cppclass4_demo2()
{
    CppClass4Demo2Time t(8, 30, 15);
    CppClass4Demo2Date d(2015, 4, 3);
    string result = t.ShowTime(d); // 2016-4-3 8:30:15
}

class CppClass4Demo3Date;
class CppClass4Demo3Time
{
public:
    CppClass4Demo3Time(int h, int m, int s)
    {
        _hour = h;
        _minute = m;
        _second = s;
    }

    string ShowTime(CppClass4Demo3Date &d);

private:
    int _hour;
    int _minute;
    int _second;
};

class CppClass4Demo3Date
{
    // 友元类声明:声明 CppClass4Demo3Time 类是我的友元类(CppClass4Demo3Time 类中的成员函数可以访问我的 private 和 protected 属性和函数)
    friend CppClass4Demo3Time;

public:
    CppClass4Demo3Date(int y, int m, int d)
    {
        _year = y;
        _month = m;
        _day = d;
    }

private:
    int _year;
    int _month;
    int _day;
};

// CppClass4Demo3Time 是 CppClass4Demo3Date 的友元类
// CppClass4Demo3Time 类中的成员函数可以访问 CppClass4Demo3Date 的 private 和 protected 属性和函数
string CppClass4Demo3Time::ShowTime(CppClass4Demo3Date &d)
{
    d._year = 2016;
    return int2string(d._year) + "-" + int2string(d._month) + "-" + int2string(d._day) + " " + int2string(_hour) + ":" + int2string(_minute) + ":" + int2string(_second);
}

// 友元类的演示
void cppclass4_demo3()
{
    // 注:
    // 1、如果 B 是 A 的友元类,那么 A 不一定是 B 的友元类
    // 2、如果 B 是 A 的友元类,C 是 B 的友元类,那么 C 不一定是 A 的友元类

    CppClass4Demo3Time t(8, 30, 15);
    CppClass4Demo3Date d(2015, 4, 3);
    string result = t.ShowTime(d); // 2016-4-3 8:30:15
}

OK
[源码下载]

时间: 2024-10-31 05:10:26

不可或缺 Windows Native (20) - C++: 友元函数, 友元类的相关文章

不可或缺 Windows Native (23) - C++: 虚函数

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppHuman { protected: string Name; public: // 我是虚函数 virtual string Show(); // 我是纯虚函数(后面的“=0”只起形式上的作用,用

不可或缺 Windows Native (6) - C 语言: 函数

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h #ifndef _MYHEAD_FUNCTION_ #define _MYHEAD_FUNCTION_ #ifdef __cplusplus extern "C" #endif // 函数声明 // 像这种在 .h 中声明的函数,如果想被外部文件调用的话,则外部文件不用再声明即可调用 char *demo_cFunction(); long recursion

不可或缺 Windows Native (22) - C++: 多重继承, 虚基类

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1.基类 1CppBase1.h #pragma once #include <string> #include "CppBaseVirtual.h" using namespace std; namespace NativeDll { // virtual 代表 CppBaseVirtual 是 CppBase1 的虚基类(虚基类是在声明派生类时,指定继承方式

不可或缺 Windows Native 系列文章索引

[源码下载] 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Windows Native 之 C 语言 在 Windows Store Apps 中调用 C/C++ hello c 2.不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型 介绍不可或缺 Windows Native 之 C 语言 常量 变量 基本数据类型 3.不可或缺 Windows Native (3) - C 语言:

不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 函数重载 缺省参数 内联函数 函数模板 示例1.函数重载, 缺省参数CppFunction1.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppFunction1 { public: string Demo(); }; } CppFunction1.cpp /* * 函数重载,缺省参数

不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自定义类型转换 示例CppOperator.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppOperator { public: string Demo(); }; } CppOperator.cpp /* * 运算符重载, 自定义类型转换 */ #include &qu

不可或缺 Windows Native (7) - C 语言: 指针

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #ifndef _MYHEAD_POINTER_ #define _MYHEAD_POINTER_ #ifdef __cplusplus extern "C" #endif char *demo_cPointer(); #endif cPointer.c /* * 指针 */ #include "pch.h" #include "c

不可或缺 Windows Native (10) - C 语言: 文件

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 文件 示例cFile.h #ifndef _MYHEAD_FILE_ #define _MYHEAD_FILE_ #ifdef __cplusplus extern "C" #endif char *demo_cFile(char *rootPath); #endif cFile.c /* * 文件 * * 从用户角度讲,文件可分为普通文件和设备文件两种 * 1.普通文件是指保存在磁盘或其它外

不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, const 对象的引用 作者:webabcd 介绍不可或缺 Windows Native 之 C++ this 指针 对象数组 对象和指针 const 对象 const 指针和指向 const 对象的指针 const 对象的引用 示例1.CppEmployee 类CppEmployee.h #pragma