最近在学习 C++,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习C++的童鞋们提供一份参考。
友元
C++是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。于是就有了友元(friend)的概念,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私。
友元函数
把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。
- 全局函数声明为友元的格式:friend 返回值类型 函数名(参数表);
- 其他类的成员函数声明为友元的格式:friend 返回值类型 其他类的类名::成员函数名(参数表);–(注:不能把其他类的私有成员函数声明为友元)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <iostream> using namespace std;
class Test { public: Test(); ~Test(); int GetA(); friend void SetA(Test *,int); private: int a; int b; };
Test::Test() { a = 100; b = 200; }
Test::~Test() { }
int Test::GetA() { return this->a; }
void SetA(Test *t1, int a) { t1->a = a; }
int main() { Test t1; cout << t1.GetA() << endl; SetA(&t1, 20); cout << t1.GetA() << endl; system("pause"); return 0;
}
|
友元类
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class 类名;
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
- 友元关系不能被继承。
- 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
- 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include <iostream> using namespace std;
class A { public: A(); ~A(); void DisPlay(); friend class B;
private: int x; };
A::A() { }
A::~A() { }
void A::DisPlay() { cout << x << endl; }
class B { public: B(); ~B(); int SetA(int a) { Aobj.x = a; return Aobj.x; }
int GetA() { cout << Aobj.x << endl; return Aobj.x; } private: A Aobj; };
B::B() { }
B::~B() { } int main() { B b1; b1.SetA(100); b1.GetA(); system("pause");
}
|