【C++】友元与静态成员

来源:互联网 发布:自知无知便是知 编辑:程序博客网 时间:2024/06/04 23:30

友元

C++中,类外的成员不能访问类内的私有和保护类型成员。而友元函数可以不受访问限制访问类的任何成员。友元函数虽然可以在类内进行声明,但是友元函数不是成员函数,因此没有this指针。
举例说明:

class Clock{public:    Clock(int, int, int);    friend void Show(Clock &);private:    int hour;    int minute;    int second;};Clock::Clock(int h, int m, int s){    hour = h;    minute = m;    second = s;}void Show(Clock& c){    cout << c.hour << ":" << c.minute << ":" << c.second << endl;}int main(){    Clock c(8, 10, 12);    Show(c);    return 0;}

一般来说,友元函数带有一个与其有好友关系的类类型的入口参数。因为友元函数不是与其有好友关系的类的成员函数,它没有this指针,所以它不能直接引用类成员的名字。它必须通过作为入口参数传递进来的对象名或对象指针来引用该对象的成员。
如上例子,Show函数的参数是一个Clock类型的引用,可以利用引用来访问友元函数的好友类的私有成员。

class Clock{public:    Clock(int, int, int);    void Show();private:    int hour;    int minute;    int second;};Clock::Clock(int h, int m, int s){    hour = h;    minute = m;    second = s;}void Clock::Show(){    cout << hour << ":" << minute << ":" << second << endl;}int main(){    Clock c(8, 10, 12);    c.Show();    return 0;}

而上述代码是将Show()声明为成员函数,利用this指针来访问该类的私有数据。
那么,友元函数究竟有什么用呢?
首先,友元机制是对类的封装机制的补充,利用这种机制,一个类可以赋予某些函数访问它的私有成员的特权。声明一个类的友元函数,就可以用这个函数直接访问该类的私有数据,从而提高程序执行的效率。
其次,友元提供了不同类的成员函数之间、类的成员函数和普通函数之间进行数据共享的机制。尤其当一个函数需要访问多个类的私有成员时,友元函数非常有用。普通的成员函数只能访问其所属类的私有成员,但是多个类的友元函数能够访问相关所有类的私有成员。

友元函数的声明可以出现在类的任何地方,(包括在public和private部分)也就是说友元的声明不受成员访问控制符的限制。
友元的关系是单向的,而不是双向的。如果声明了B是A的友元类,不等于A类也是B类的友元类,A类中的成员函数不一定能够访问B类的成员。
友元关系不能传递。

静态成员

在C++中,要实现类的多个对象之间的数据共享,可使用静态成员。静态成员包括两种,一种是静态数据成员,另一种是静态成员函数。
类的普通数据成员在类的每个对象中都拥有一个拷贝,就是说每个对象的同名数据成员可以分别存储不同的数值,这也保证对象拥有自身区别于其他对象的特征需要。但是静态数据成员每个类只有一个拷贝,由该类所有对象共同维护和使用,从而实现了同一个类的不同对象之间的数据共享。
静态数据成员在内存中只占用一份存储空间,它是属于类的,但是它被该类的所有对象所共享,每个对象都可以访问这个静态数据成员。静态数据成员的值对所有对象都是一样的。如果改变它的值,则在各个对象中这个数据成员的值都同时变了。可以节约空间,提高效率。
如果只声明了类而未定义对象,则类的一般数据成员是不占存储空间的,只有在定义对象时,才为对象的数据成员分配空间。但是静态数据成员不属于某一个对象,在为对象开辟空间的同时并不会为静态数据成员分配空间。静态数据成员是在所有对象之外单独开辟空间。它是在程序编译时被分配空间的,到程序结束时才释放空间。