static
static 本意为“静态”,其修饰的变量存放于静态存储区(同全局变量一样),其作用域和生存期也会与普通变量所不同。
依照位置,可以分为四种
全局变量前
这个改变了变量的作用域,具体不累述。
局部变量前
这个可以改变该局部变量的生存期,使之一直保持在程序结束之后,而作用域不变。这一特性,减少了全局变量的使用,符合良好的编程习惯,如在如下程序中——
void Test()
{
while(true)
{
...
static count; //即便不初始化也ok,因为static变量默认值为0.
count ++;
}
}
同时,需要指出的是:static变量,在程序运行初始化的时候,就已经先初始化了,并非是顺序执行到这里时才赋值。这一点,在VS中Debug时,便会发现,调试过程中根本不会执行static count;
这一条语句。
类的数据成员
- 类中的static关键字可以作用于数据成员和成员函数,其基本目的,也是实现“静态”,这里进一步延伸为该变量或者函数为抽象的类所有,而非形形色色的对象,也不会动态变化,也因此可以实现在建立对象前,就可以为静态数据成员赋值。
- 其中静态的数据成员只能在类的外部定义,定义格式为:
<数据类型> <类名>::<数据成员名>=<value>
类的成员函数
- 类的静态成员函数不可以使用this指针。
参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html
friend
- 由于C++类的访问限制,外部函数或者另一个类的函数无法访问类的私有和保护成员,这也是C++中封装的要求。但是某些情况,我们需要“破坏”这一机制,在外部去试图访问这些私有成员,这就有在被访问的类中声明:对方是我方的“朋友”,不吝分享我的私密资源
友元函数
- 友元函数不属于类的内部函数,但需要在类中申明该函数,不过定义该函数可以在类内或是类外
#include<iostream>
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!"<<endl;
return 0;
}
友元类
当在A中定义了其friend为B时,B的成员函数便可以访问A的私有变量,同上。
- 注:注意friend的单向性,A声明其朋友为B,则换句话说,B是A的朋友,故可以访问A的信息;但A未必是B的朋友(只是A的一厢情愿罢了),故A不可以访问B的信息。即,信息流的访问是单向的。
网友评论