C++友元函数基本用法(声明、定义、调用)

本文主要总结一个C++中基本的友元函数用法,包括友元函数声明和定义、一个应用简单例子和编译结果,友元函数特性总结,下面是具体讲述。

1.1友元函数声明和定义

首先友元函数是声明在类中的,作用是可以反问该类的私有成员(成员函数和成员参数)。其中,友元函数的声明跟平常函数声明基本一样,只需要在函数声明前加一个friend就行,友元函数的定义跟普通函数定义一模一样(不需要指定类作用域运算符),下面是一个典型的友元函数声明和定义。

#include 

//友元函数在类中声明
friend ostream & operator<<(ostream &os, const CFriendClass &friendClass);


//友元函数在类中定义,不能用作用域解析运算符,因为友元函数不是成员函数,也不能被继承
ostream & operator<<(ostream &os, const CFriendClass &friendObject)
{
	//友元函数访问私有成员变量,但是不能直接在定义友元函数时调用私有成员变量,只能通过引用类对象的成员参数方式调用
	os << "operator friendObject.value==" << friendObject.value << endl;
	return os;
}

1.2友元函数应用简单例子

在vs2013新建一个console空白工程,分别在文件FriendClass.h,FriendClass.cpp,main.cpp中添加如下代码

FriendClass.h(编译环境vs2013 console工程)

#pragma once
#include 

using std::ostream;

class CFriendClass
{
public:
	CFriendClass();
	~CFriendClass();

	friend int getValue(CFriendClass &friendObject);
	friend ostream & operator<<(ostream &os, const CFriendClass &friendObject);

private:
	int value;
};

 

FriendClass.cpp

#include "FriendClass.h"

using std::cout;
using std::endl;

CFriendClass::CFriendClass() :value(66)
{	
}

int getValue(CFriendClass &friendObject)
{
	//友元函数访问私有成员变量,但是不能直接在定义友元函数时调用私有成员变量,只能通过引用类对象的成员参数方式调用
	cout << "getValue value==" << friendObject.value<

 

main.cpp

#include 
#include 
#include "FriendClass.h"

/*using编译指令还可以在派生类中显示声明基类成员,包括私有成员函数和私有成员参数,声明后,在派生类中可以调用基类私有成员*/
using std::cout;
using std::endl;
using std::string;

int main()
{
	//友元函数访问私有成员变量,但是不能直接在定义友元函数时调用私有成员变量,只能通过引用类对象的成员参数方式调用
	CFriendClass friendObject;
	getValue(friendObject);

	cout << "friendObject==" << friendObject << endl;

	cout << string("this is a string!");

	getchar();

	return 0;
}

1.3编译运行结果

C++友元函数基本用法(声明、定义、调用)_第1张图片

1.4友元函数特性总结

由上面示例代码可知,友元函数访问类的私有成员,是通过类的引用来调用类的私有成员。

a1 成员函数不能直接调用类的私有成员,而是要通过引用或者指针来调用类的私有成员。

a2 友元函数不是类的成员函数,不能用作用域解析运算符操作

a3 友元函数因为不是成员函数,不能被派生类继承

当执行代码cout << "friendObject==" << friendObject << endl;,也就是执行cout << friendObject时,实际是执行操作运算符cout.operator(friendObject),即调用了友元函数ostream & operator<<(ostream &os, const CFriendClass &friendObject)。要注意前后顺序,不能将友元函数中的成员参数顺序颠倒(ostream & operator<<(const CFriendClass &friendObject, ostream &os)),否则出现friendObject.operator(cout),则调用错误!!!

 

参考内容:

《C++ Primer Plus》(第6版)中文版  539-542页(参考:友元声明和定义,调用实例)

https://blog.csdn.net/qq_26337701/article/details/53996104(参考:友元函数调用)

https://blog.csdn.net/qq_29511193/article/details/77131203(参考:友元函数声明和定义)

你可能感兴趣的:(C++应用积累)