C++友元函数以及运算符重载
2014-03-29 09:50
155 查看
一、友元函数的作用
函数的私有和保护变量在类内可以访问,在类外只可访问公有变量;派生类在类内只可访问其基类的公有变量和保护变量,在类外只可访问其公有变量(要看具体的继承类型);
因此,在有些情况下,需要访问类的私有或保护变量时,不得不调用其成员函数,因为只有成员函数才有访问的权限。因而多出许多时间开销。
友元函数和类的成员函数的访问权限相同,但是其不是类的成员函数,它破坏了类的封装性;友元函数分为三类:普通的友元函数,友元类,和类的成员函数成为友元函数;
因为友元函数没有this指针,则参数要有三种情况:
2.1.1 要访问非static成员时,需要对象做参数;
2.1.2 要访问static成员或全局变量时,则不需要对象做参数;
2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;
(1)普通友元函数:常用的就是运算符重载
友元函数的位置是无关紧要的;
(2)友元类
使用单个声明使A类的所有函数成为类X的友元,它提供一种类之间合作的一种方式,使类A的对象可以具有类A和类time的功能
(3)类A的一个成员函数成为类B的友元函数
注意:此时类A的定义一定要在类time之前,此时test()函数的声明在类time之前,方为正确的,若在之后定义,则test()即使声明为友元函数,依然无法访问其私有变量;
ps:刚刚写的时候,利用头文件和cpp文件进行封装,在操作符重载函数前加了个inline 即
函数的私有和保护变量在类内可以访问,在类外只可访问公有变量;派生类在类内只可访问其基类的公有变量和保护变量,在类外只可访问其公有变量(要看具体的继承类型);
因此,在有些情况下,需要访问类的私有或保护变量时,不得不调用其成员函数,因为只有成员函数才有访问的权限。因而多出许多时间开销。
友元函数和类的成员函数的访问权限相同,但是其不是类的成员函数,它破坏了类的封装性;友元函数分为三类:普通的友元函数,友元类,和类的成员函数成为友元函数;
因为友元函数没有this指针,则参数要有三种情况:
2.1.1 要访问非static成员时,需要对象做参数;
2.1.2 要访问static成员或全局变量时,则不需要对象做参数;
2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;
(1)普通友元函数:常用的就是运算符重载
#include <iostream> using namespace std; class time { friend ostream& operator<<(ostream&,time& t); private: int x; int y; int z; public: time(int a,int b,int c):x(a),y(b),z(c){}; }; ostream& operator<<(ostream& out,time& t) { out<<"("<<t.x<<t.y<<t.z<<")"; return out; } int main() { time t(1,2,3); cout<<t<<endl; return 0; }
友元函数的位置是无关紧要的;
(2)友元类
#include <iostream> using namespace std; class A; class time { friend ostream& operator<<(ostream&,time& t); private: int x; int y; int z; public: time(int a,int b,int c):x(a),y(b),z(c){}; friend A; }; class A { private: int m; int n; public: void test(time& t); }; void A::test(time& t) { m=t.x; n=t.y; } ostream& operator<<(ostream& out,time& t) { out<<"("<<t.x<<t.y<<t.z<<")"; return out; } int main() { time t(1,2,3); cout<<t<<endl; A a; a.test(t); return 0; }
使用单个声明使A类的所有函数成为类X的友元,它提供一种类之间合作的一种方式,使类A的对象可以具有类A和类time的功能
(3)类A的一个成员函数成为类B的友元函数
#include <iostream> using namespace std; class time; class A { private: int m; int n; public: void test(time& t); }; class time { friend void A::test(time& t); friend ostream& operator<<(ostream&,time& t); private: int x; int y; int z; public: time(int a,int b,int c):x(a),y(b),z(c){}; }; void A::test(time& t) { m=t.x; n=t.y; } ostream& operator<<(ostream& out,time& t) { out<<"("<<t.x<<t.y<<t.z<<")"; return out; } int main() { time t(1,2,3); cout<<t<<endl; A a; a.test(t); return 0; }
注意:此时类A的定义一定要在类time之前,此时test()函数的声明在类time之前,方为正确的,若在之后定义,则test()即使声明为友元函数,依然无法访问其私有变量;
ps:刚刚写的时候,利用头文件和cpp文件进行封装,在操作符重载函数前加了个inline 即
inline ostream& operator<<(ostream& out,time& t) { return out<<"("<<t.x<<t.y<<t.z<<")"; }将它放在了cpp文件中,总是报错,后将其和头文件放在一起,就没有错误了;
相关文章推荐
- 【C++的探索路8】运算符重载为友元以及可变长数组程序编写
- 【c++】关于类继承运算符重载友元函数
- 从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载
- C++: 运算符重载(一)、友元函数、链式编程支持
- 队列(queue) 之 c++模板实现(友元函数和运算符重载)
- C++抽象编程——面向对象(4)——运算符重载与友元函数
- c++实现单链表(构造函数 拷贝函数 前插 后插 运算符重载 冒泡排序以及逆置)
- C++:类————运算符重载、友元函数
- C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数
- 《C++第八周实验报告1-1(2)》----复数类中的运算符重载,用类的友元函数
- C++对象初始化以及运算符重载
- C++默认的构造函数以及运算符重载关键点
- 《C++第八周实验报告1-1(2)》----复数类中的运算符重载,用类的友元函数
- c++ 运算符重载 友元函数
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
- 从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载
- C++ 友元函数和非成员运算符重载
- C++实现输入输出运算符重载、友元函数和成员函数实现复数类Complex
- C++默认的构造函数以及运算符重载关键点
- C++Primer Plus 第十一章-运算符重载和友元函数