C++中的友元函数和友元类
C++中的友元函数主要应用于以下场景:
友元函数
第一种场景
代码中有一个全局函数,该函数想要去访问某个类的成员变量(该类的成员变量是private的,且该类并未提供任何获取获取私有成员变量的public方法),这时候可以在这个类中把该全局函数声明为友元函数,这样这个全局函数就具备了能够获取那个类的私有成员变量的资格。
例:通过友元函数获取Person类的各项字段信息:
main.cpp
#include <iostream>
#include "Person.h" void showPersonInfo(Person *person)
{
std::cout << person->m_name << ", age is: " << person->m_age << ", sex is: " << person->m_sex << std::endl;
}
int main()
{
Person *person = new Person("xp.chen", 20, 1);
showPersonInfo(person);
delete person; getchar();
return 0;
}
person.h
#pragma once
class Person
{
private:
char *m_name;
int m_age;
int m_sex;
public:
Person(char *name, int age, int sex);
~Person();
public:
friend void showPersonInfo(Person *person); // 将showPersonInfo()函数声明为友元函数
};
person.cpp
#include "Person.h" Person::Person(char *name, int age, int sex)
:m_name(name)
, m_age(age)
, m_sex(sex)
{
} Person::~Person()
{
}
运行结果:
xp.chen, age is: 20, sex is: 1
第二种场景
在某个类(假设为A类)有一个成员函数,该成员函数想去访问另一个类(假设为B类)中的私有成员变量。这时候则可以在第二个类(B类)中,声明第一个类(A类)的那个成员函数为友元函数,这样第一个类(A类)就可以访问第二个类(B类)的私有成员变量了。
例:打印Person类的详细信息(包含姓名,年龄,性别,省份,城市,街道)
Person.h
#pragma once class Address;
class Person
{
private:
char *m_name;
int m_age;
int m_sex;
public:
Person(char *name, int age, int sex);
~Person();
public:
void showDetailInfo(Address *addr); // 用于打印包含姓名,年龄,性别,省份,城市,街道的详细信息
};
Address.h
#pragma once
#include "Person.h" class Address
{
private:
char *m_province;
char *m_city;
char *m_district; public:
Address(char *province, char *city, char *district);
~Address();
public:
friend void Person::showDetailInfo(Address *addr);
};
Address.cpp
#include "Address.h" Address::Address(char *province, char *city, char *district)
:m_province(province)
, m_city(city)
, m_district(district)
{
} Address::~Address()
{
}
Person.cpp
#include <iostream>
#include "Address.h" Person::Person(char *name, int age, int sex)
:m_name(name)
, m_age(age)
, m_sex(sex)
{
} void Person::showDetailInfo(Address *addr)
{
std::cout << "Name: " << m_name << ", Age: " << m_age << ", Sex: " << m_sex << ", Province: " << addr->m_province << ", City: " << addr->m_city << ", District: " << addr->m_district << std::endl;
} Person::~Person()
{
}
main.cpp
#include <iostream>
#include <stdlib.h>
#include "Address.h" int main()
{
Person *person = new Person("xp.chen", , );
Address *address = new Address("JS", "KS", "ZhengRoad");
person->showDetailInfo(address); delete person, address;
system("pause");
return ;
}
运行结果:
Name: xp.chen, Age: 20, Sex: 1, Province: JS, City: KS, District: ZhengRoad
友元类
友元类则更简单,可以将一个类(类A)声明成另一个类(类B)的友元类,那么类A就拥有了能够访问类B所有成员的资格,包括private, protected, public的。
例:将上述例子中的Address.h修改成:
#pragma once
#include "Person.h" class Address
{
private:
char *m_province;
char *m_city;
char *m_district; public:
Address(char *province, char *city, char *district);
~Address();
public:
friend class Person;
};
声明类Person是类Address的友元类,再次运行程序:
Name: xp.chen, Age: 20, Sex: 1, Province: JS, City: KS, District: ZhengRoad
需要注意的是:
- 友元的关系是单向的而不是双向的。如果声明了类 B 是类 A 的友元类,不等于类 A 是类 B 的友元类,类 A 中的成员函数不能访问类 B 中的 private 成员。
- 友元的关系不能传递。如果类 B 是类 A 的友元类,类 C 是类 B 的友元类,不等于类 C 是类 A 的友元类。
另外,有的编译器也可以不写class关键字,也就是说可以写成:friend Person, 不过为了兼容性还是建议写上。
C++中的友元函数和友元类的更多相关文章
- C++学习12 友元函数和友元类
友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...
- C++:友元(非成员友元函数、成员友元函数、友元类)
3.8 友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的 ...
- 友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...
- c++友元函数与友元类
友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...
- C++ friend友元函数和友元类(转)
一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...
- 2.19 C++友元函数和友元类
参考: http://www.weixueyuan.net/view/6350.html 总结: 借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属 ...
- C++之友元函数和友元类
通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数. #include<iostream>using namespace std; ...
- 【C++基础 05】友元函数和友元类
友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...
- C++友元函数、友元类
1.什么是友元函数? 友元函数就是可以直接访问类的成员(包括私有数据)的非成员函数,也就是说他并不属于这个类,他是一种外部的函数. 一个外部函数只能通过类的授权成为这个类友元函数,这就涉及到一个关键字 ...
随机推荐
- 在quartz的Job中获得Spring的WebApplicationContext或ServletContext
有时候我们需要在web工程中定时器类里面获得spring的IOC容器,即WebApplicationContext,用它来获取实现了某接口的所有的bean,因为@Autowired貌似只能注入单个be ...
- Git 经常使用命令合集
====== Git 经常使用命令合集 ====== === 1.Git 文档 === Git 中文文档观看地址:http://git.oschina.net/progit/ === ...
- DOM,浏览器,javascript,html之间的关系
来源于:https://github.com/hucheng91/myBlog/blob/master/web/dom/dom.md DOM定义 DOM可以以一种独立于平台和语言的方式访问和修改一个文 ...
- <转>LUA语法分析
本文选自:http://www.cnblogs.com/nazhizq/p/6516561.html 一步步调试,在lparser.c文件中luaY_parser函数是语法分析的重点函数,词法分析也是 ...
- C语言中的随意跳转
C语言中有一个很不常用的头文件:setjmp.h. 这个头文件是C语言底层实现的,不像math.h里面的函数都是纯C语言实现的. setjmp.h包含两个函数: longjmp 跳转到某个位置 set ...
- java 记录一下socket的server与client
package com.test.server; import java.io.IOException; import java.net.ServerSocket; import org.apache ...
- ROS学习(八)—— 理解ROS服务和参数
一.ROS 服务 服务(services)是节点之间通讯的另一种方式.服务允许节点发送请求(request) 并获得一个响应(response) 二.rosservice 1.用途 rosservic ...
- Block(二)内存管理与其他特性-b
一.block放在哪里 我们针对不同情况来讨论block的存放位置: 1.栈和堆 以下情况中的block位于堆中: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Spring MVC @PathVariable被截断
一.问题描述 一个控制器提供RESTful访问信息: @RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + &qu ...
- Linux内核同步:RCU
linux内核 RCU机制详解 简介 RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用.RCU主要针对的数据对象是链表,目的是提高遍历读取数据的 ...