为什么要引入友元函数?
因为我们不能在类的外部访问类的私有变量。
传统的访问方法:
- //============================================================================
- // Name : main.cpp
- // Author : ShiGuang
- // Version :
- // Copyright : sg131971@qq.com
- // Description : Hello World in C++, Ansi-style
- //============================================================================
- #include <iostream>
- #include <string>
- using namespace std;
- class aa
- {
- private:
- float a;
- float b;
- public:
- float &aaa()
- {
- return (a);
- }
- float &bbb()
- {
- return (b);
- }
- };
- aa sum(aa a, aa b)
- {
- aa c;
- c.aaa() = a.aaa() + b.aaa();
- c.bbb() = a.bbb() + b.bbb();
- return (c);
- }
- int main(int argc, char **argv)
- {
- aa a, b;
- a.aaa() = 1;
- a.bbb() = 2;
- b.aaa() = 3;
- b.bbb() = 4;
- aa c = sum(a, b);
- cout << c.aaa() << endl;
- cout << c.bbb() << endl;
- return 0;
- }
- //============================================================================
- // Name : main.cpp
- // Author : ShiGuang
- // Version :
- // Copyright : sg131971@qq.com
- // Description : Hello World in C++, Ansi-style
- //============================================================================
- #include <iostream>
- #include <string>
- using namespace std;
- class aa
- {
- private:
- float a;
- float b;
- public:
- float &aaa()
- {
- return (a);
- }
- float &bbb()
- {
- return (b);
- }
- friend aa sum(aa, aa);
- friend int main(int argc, char **argv);
- };
- aa sum(aa s, aa t)
- {
- aa c;
- c.a = s.a + t.a;
- c.b = s.b + t.b;
- return (c);
- }
- int main(int argc, char **argv)
- {
- aa a, b;
- a.a = 1;
- a.b = 2;
- b.a = 3;
- b.b = 4;
- aa c = sum(a, b);
- cout << c.a << endl;
- cout << c.b << endl;
- return 0;
- }
对于使用友元:
(1)声明的位置既可在public区,也可在protected区。友元函数虽然是在类内进行声明,但它不是该类的成员函数,不属于任何类。
(2)在类外定义友元函数,与普通函数的定义一样,一般与类的成员函数放在一起,以便类重用时,一起提供其友元函数。
(3) 友元函数是能访问类的所有成员的普通函数,一个函数可以是多个类的友元函数,只需在各个类中分别声明。
(4)友元能使程序精炼,提高程序的效率。
(5)友元破坏了类的封装,使用时,要权衡利弊,在数据共享与信息隐藏之间选择一个平衡点。