C++友元函数和类
2016-03-14 15:12
295 查看
一般函数分为全局函数,和类中的成员函数,相对,有友元全局函数和友元成员函数。下面就是一个在类中的友元函数,一定要传入当前类的一个对象或引用或者本身,就是能访问到私有或保护成员。
当友元函数为其他类的成员函数时。
友元也有一些风险,在上个例子中,通过成员函数很方便访问到coordinate的私有成员,很方便,但同时也破坏了它的封装性,当不小心改了这个值以后,也很不容易察觉。
友元类的声明和友元函数类似。
在实现Circle类时,如下代码。可以再类中数据成员包含一个友元的类,并调用其私有成员。
友元的注意事项:
1. 友元的关系不能传递;
2. 友元函数的单向性,A是B的友元,不一定B是A的友元;
3. 友元的数量形式不受限制。
友元是封装的补充,但不是好的方法,因为破坏了封装性,所以尽量不要用友元。
class Coordinate { friend void printXY(Coordinate &c); public: Coordinate(int x, int y); private: int m_iX; int m_iY; };友元函数的应用。
void printXY(Coordinate &c) { cout << c.m_iX << c.m_iY << endl;//友元函数可以顺利访问private } int main() { Coordinate coor(3, 5); printXY(coor);//传入对象名而非地址 return 0; }
当友元函数为其他类的成员函数时。
class Coordinate { friend void Circle::printXY(Coordinate &c);//是Circle类的成员函数 public: Coordinate(int x, int y); private: int m_iX; int m_iY; }; class Circle { void printXY(Coordinate &c) { cout << c.m_iX << c.m_iY << endl; } }; int main() { Coordinate coor(3, 5); Circle circle; circle.printXY(coor);//传入对象名而非地址 return 0; }
友元也有一些风险,在上个例子中,通过成员函数很方便访问到coordinate的私有成员,很方便,但同时也破坏了它的封装性,当不小心改了这个值以后,也很不容易察觉。
友元类的声明和友元函数类似。
class Circle;//要告诉计算机,这个类是定义过的 class Coordinate { friend Circle; public: Coordinate(int x, int y); private: int m_iX; int m_iY; };
在实现Circle类时,如下代码。可以再类中数据成员包含一个友元的类,并调用其私有成员。
class Circle { public: void printXY(c) { cout << c.m_iX << c.m_iY << endl; } private: Coordinate m_coor; };
友元的注意事项:
1. 友元的关系不能传递;
2. 友元函数的单向性,A是B的友元,不一定B是A的友元;
3. 友元的数量形式不受限制。
友元是封装的补充,但不是好的方法,因为破坏了封装性,所以尽量不要用友元。
相关文章推荐
- 【C++ STL学习之五】STL算法库
- 解析C++函数的默认参数和占位参数及较之C语言的拓展
- c++内存问题整理与智能指针使用
- C++为什么要引入静态成员函数
- 【C++ STL学习之四】Map类模板
- C++ 内存管理
- C++在C语言基础之上增强的几个实用特性总结
- C++_C风格字符串
- 调试基础 eclipse C++ 断点调试
- C++_运算符的优先级
- C++ Set常用用法
- c++内存模型
- c++ assert
- C语言实现动态顺序表
- C语言实现静态顺序表
- C++类外直接访问私有成员
- 51Nod--1384全排列
- C++中cos,sin,asin,acos这些三角函数操作的是弧度,而非角度,
- C-C++字符输出时遇到字符'\n','\0'的区别
- 容器基础知识