C++ 友元
2016-07-17 23:17
363 查看
编译器采用mingw32-g++ c++11,编辑器为codeblocks
如果一个类想要其他类或者函数能够访问这个类的非公有成员,那么可以采用友元的方式。
友元函数:
如果想让某个非成员函数能够操作类中的私有成员,可以在这个中声明这个函数,并且在函数的前面表上friend的关键字。一般来说,最好再类定义开始或结束前的位置集中声明友元。
友元类:
简单点说就是一个类可以使用另外一个类当中的私有成员。如果想在类A当中使用类B当中的私有成员,那么需要在类B当中声明friend class A;
同时要注意,友元关系不具有传递性质。
类中的成员函数作为友元:
把一个成员函数声明成友元时,必须要明确指出该成员函数属于哪个类。例如在类A当中又一个成员函数fun()要使用类B当中的私有成员,需要按照以下步骤执行。
1.首先前向声明类B
2.定义类A,声明类A当中的fun()函数,但是不能定义fun()函数
3.接下来定义类B,同时声明类A当中的友元函数
4.定义fun函数
友元的声明和作用域:
友元函数可以直接在类中声明+定义。
要想再类中调用fun,那么必须先声明,否则会报错。
这里注意,有的编译器不会强制执行上诉关于友元的限定规则。(书上如是说)
如果一个类想要其他类或者函数能够访问这个类的非公有成员,那么可以采用友元的方式。
友元函数:
如果想让某个非成员函数能够操作类中的私有成员,可以在这个中声明这个函数,并且在函数的前面表上friend的关键字。一般来说,最好再类定义开始或结束前的位置集中声明友元。
class A { friend void fun(A &a); public: string member2; private: int member1; }; void fun(A &a)//此函数可以使用class A中的私有成员 { a.member1=0; }
友元类:
简单点说就是一个类可以使用另外一个类当中的私有成员。如果想在类A当中使用类B当中的私有成员,那么需要在类B当中声明friend class A;
同时要注意,友元关系不具有传递性质。
class B { friend class A; private: int member1; }; class A { public: string member2; void fun(B &b) { b.member1++; } private: int member1; };
类中的成员函数作为友元:
把一个成员函数声明成友元时,必须要明确指出该成员函数属于哪个类。例如在类A当中又一个成员函数fun()要使用类B当中的私有成员,需要按照以下步骤执行。
1.首先前向声明类B
2.定义类A,声明类A当中的fun()函数,但是不能定义fun()函数
3.接下来定义类B,同时声明类A当中的友元函数
4.定义fun函数
class B; class A { public: string member2; void fun(B &b); private: int member1; }; class B { friend void A::fun(B &b); private: int member1; }; void A::fun(B& b) { b.member1++; }
友元的声明和作用域:
友元函数可以直接在类中声明+定义。
class B { friend void f(B &b) { b.m2=0; } public: void get_m2(){cout<<this->m2<<endl;} string m1; private: int m2; }; int main() { ios::sync_with_stdio(false); B b; f(b); b.get_m2(); return 0; }
要想再类中调用fun,那么必须先声明,否则会报错。
class B//会报错 { friend void f(B &b) { b.m2=0; } public: void get_m2(){cout<<this->m2<<endl;} string m1; B() { f(); } private: int m2; }; void f();//添加声明 class B { friend void f(B &b) { b.m2=0; } public: void get_m2(){cout<<this->m2<<endl;} string m1; B() { f(); } private: int m2; };
这里注意,有的编译器不会强制执行上诉关于友元的限定规则。(书上如是说)
相关文章推荐
- C++中 vector容器——模板类数组
- Leet Code First Bad Version(C)
- C++11 lambda使用注意
- POJ 3461 Oulipo [KMP模板题]
- C++: 友元函数和友元类详解
- C++面试题总结
- Path Sum
- C语言的体系结构--main函数存在的必然性(听杨力祥老师的课)
- C语言的体系结构--main函数存在的必然性(听杨力祥老师的课)
- C++内存管理
- 配置eclipse编写C++程序
- 进程分配
- C++之友元函数
- C语言指针
- C++引用示例&
- C++用mysql自带的头文件连接数据库
- codeforces 527C Glass Carving
- c++11 std::async使用注意
- usaco 2.2.2 subset
- 关于C++ 顶层const和底层const对拷贝操作的影响