C++复习要点总结之——友元
2016-07-09 19:01
435 查看
在C++中,类的成员访问权限有三种,private,protected,public。
private:类中的private成员只能够在本类中或者友元访问,子类或外界无法访问私有成员。
protected:类中的protected成员只允许本类或者子类中访问,外界无法访问,(定义类时如果希望成员被子类继承而外界不能访问就可以定义为 protected成员)
public:类中public成员在本类、子类和外界中都能够进行访问。
请思考:为什么private中的成员可以被友元访问,什么是友元?友元是如何实现的?
在某些情况下,我们需要允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问。这就是友元存在的使命。例如,被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。这些操作符不可能为类的成员。然而,尽管不是类的成员,它们仍是类的“接口的组成部分”。
而友元机制,允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。
下面给出C++中所有有关友元的结论和限制,然后后面针对每个细节给出示例:
1. 友元函数
Ø 友员类通常设计为一种对数据操作或类之间传递消息的辅助类
将类man声明为类woman的友元类,使得可以通过类man对象访问类woman的私有成员。
class woman; // 前向声明
class man
{
public:
void disp(woman &w);
void reset(woman &w);
};
class woman
{
public:
friend class man; // 将man设为woman的友元类,这样man对象的任何成员函数都可以访问woman的私有成员
private:
string name;
};
void man::disp(woman &w)
{
cout << w.name << endl;
}
void man::reset(woman &w)
{
w.name.clear();
}
private:类中的private成员只能够在本类中或者友元访问,子类或外界无法访问私有成员。
protected:类中的protected成员只允许本类或者子类中访问,外界无法访问,(定义类时如果希望成员被子类继承而外界不能访问就可以定义为 protected成员)
public:类中public成员在本类、子类和外界中都能够进行访问。
请思考:为什么private中的成员可以被友元访问,什么是友元?友元是如何实现的?
在某些情况下,我们需要允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问。这就是友元存在的使命。例如,被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。这些操作符不可能为类的成员。然而,尽管不是类的成员,它们仍是类的“接口的组成部分”。
而友元机制,允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。
下面给出C++中所有有关友元的结论和限制,然后后面针对每个细节给出示例:
1. 友元函数
2友元类
Ø 若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数Ø 友员类通常设计为一种对数据操作或类之间传递消息的辅助类
将类man声明为类woman的友元类,使得可以通过类man对象访问类woman的私有成员。
class woman; // 前向声明
class man
{
public:
void disp(woman &w);
void reset(woman &w);
};
class woman
{
public:
friend class man; // 将man设为woman的友元类,这样man对象的任何成员函数都可以访问woman的私有成员
private:
string name;
};
void man::disp(woman &w)
{
cout << w.name << endl;
}
void man::reset(woman &w)
{
w.name.clear();
}
相关文章推荐
- ubuntu12.04 gcc和g++支持 c++11特性
- C++程序员学Python:C与Python进行交互
- 第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类
- C语言strchr()函数:查找某字符在字符串中首次出现的位置
- java重载/重写(覆盖)/重构比较及其与C++差异
- C语言中的进制转换 itoa & sprintf
- C++类构造函数初始化列表
- C++中的explicit
- CrackingtheCodeInterview之C与C++
- c语言中字符指针与字符数组的区别
- c++ stl 学习
- 全排列 和 C++ string类 NYOJ 19
- POJ - 2230 Watchcow
- C以及C++语言中static作用
- C++中引用的本质
- c++中char *与string之间的相互转换及原理
- 1.C++ STL基本容器的使用(转载)
- C++的运算符重载 (转)
- C语言文件操作详解
- 【Effective C++读书笔记】篇六(条款13~条款15)