C++的两个关键字——friend & static

static

static 本意为“静态”,其修饰的变量存放于静态存储区(同全局变量一样),其作用域和生存期也会与普通变量所不同。
依照位置,可以分为四种

全局变量前

这个改变了变量的作用域,具体不累述。

局部变量前

这个可以改变该局部变量的生存期,使之一直保持在程序结束之后,而作用域不变。这一特性,减少了全局变量的使用,符合良好的编程习惯,如在如下程序中——

void Test()
{
      while(true)
      {
           ...
           static count; //即便不初始化也ok,因为static变量默认值为0.
           count ++;
      }
}

同时,需要指出的是:static变量,在程序运行初始化的时候,就已经先初始化了,并非是顺序执行到这里时才赋值。这一点,在VS中Debug时,便会发现,调试过程中根本不会执行static count;这一条语句。

类的数据成员

  • 类中的static关键字可以作用于数据成员和成员函数,其基本目的,也是实现“静态”,这里进一步延伸为该变量或者函数为抽象的类所有,而非形形色色的对象,也不会动态变化,也因此可以实现在建立对象前,就可以为静态数据成员赋值。
  • 其中静态的数据成员只能在类的外部定义,定义格式为:
    <数据类型> <类名>::<数据成员名>=

类的成员函数

  • 类的静态成员函数不可以使用this指针。

参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html

friend

  • 由于C++类的访问限制,外部函数或者另一个类的函数无法访问类的私有和保护成员,这也是C++中封装的要求。但是某些情况,我们需要“破坏”这一机制,在外部去试图访问这些私有成员,这就有在被访问的类中声明:对方是我方的“朋友”,不吝分享我的私密资源

友元函数

  • 友元函数不属于类的内部函数,但需要在类中申明该函数,不过定义该函数可以在类内或是类外
#include
using namespace std;

class Test
{
    int a ;
public:
    friend void setA(Test& t,int aa);
};
void setA(Test& t,int aa)
{
        t.a = aa;
        cout<< t.a << endl;
}


int main()
{
    Test t;
    setA(t, 3);
    cout<<"hello world!"<

友元类

当在A中定义了其friend为B时,B的成员函数便可以访问A的私有变量,同上。

  • 注:注意friend的单向性,A声明其朋友为B,则换句话说,B是A的朋友,故可以访问A的信息;但A未必是B的朋友(只是A的一厢情愿罢了),故A不可以访问B的信息。即,信息流的访问是单向的。

你可能感兴趣的:(C++的两个关键字——friend & static)