1》静态成员和静态函数只在本文件中有效,出了这个文件,即使定义同样的数据成员和同样的静态函数也不会引起错误,所以可以起到避免冲突的效用
2》全局静态变量在同一个文件中只能定义一次,但是如果你后来再写一个同名的局部静态变量那是可以的,不过全局静态变量在同一个文件中只能有一个。而局部静态变量则有所不同,譬如:在一个函数中定义了局部静态变量,后来重复调用这个函数,而局部静态变量不等同于局部变量,函数结束的时候会销毁局部变量所在的栈,而局部静态变量是存放在静态存储区的,函数结束时并没有销毁静态存储区,那重复调用函数会不会出现重复定义的情况呢?事实上是第二次调用这个函数碰到局部静态变量的初始化得时候,不去管它了,跳过。所以我们的局部静态变量只占用一片静态存储区,并且可以保证其中的内容是我们上次操作的结果
今天将类中的静态数据成员和静态函数
先讲静态数据成员:
"stdafx.h"
#include
"iostream.h"
class circle
{
private:
int x,y,r;
static int num;
public:
void print();
void add();
circle(int a,int b,int c);
};
void circle::print()
{
cout<<
"圆心:("<<x<<
","<<y<<
")"<<endl;
cout<<
"半径:"<<r<<endl;
cout<<
"静态量:"<<num<<endl<<endl;
}
void circle::add()
{
num++;
}
circle::circle(int a,int b,int c)
{
x=a;
y=b;
r=c;
}
int circle::num=0;//静态数据成员必须初始化,并且也只有这么一种引用模式,只能写在这里,写在main函数里面也是错的
int main(int argc, char* argv[])
{
circle p1(0,0,1);
p1.add();
p1.print();
circle *p2=
NULL;
p2=
new circle(0,0,2);
p2->add();
p2->print();
delete p2;
p2=
NULL;
return 0;
}
结果:
圆心:(0,0)
半径:1
静态量:1
圆心:(0,0)
半径:2
静态量:2
注意:静态数据成员属于类,而不属于对象,事实上,这个静态变量可以实现各个对象之间的共享
静态函数
"stdafx.h"
#include
"iostream.h"
class circle
{
private:
int x,y,r;
static int num;
public:
static void print(circle s);
void add();
circle(int a,int b,int c);
};
void circle::print(circle s)
{
// cout<<
"圆心:("<<x<<
","<<y<<
")"<<endl;//错,静态函数中不能调用非静态数据成员
// cout<<
"半径:"<<r<<endl;
cout<<
"静态量:"<<num<<endl;
cout<<
"圆心:("<<s.x<<
","<<s.y<<
")"<<endl;
cout<<
"半径:"<<s.r<<endl<<endl;
}
void circle::add()
{
num++;
}
circle::circle(int a,int b,int c)
{
x=a;
y=b;
r=c;
}
int circle::num=0;//静态数据成员必须初始化,并且也只有这么一种引用模式,只能写在这里,写在main函数里面也是错的
int main(int argc, char* argv[])
{
circle p1(0,0,1);
p1.add();
p1.print(p1);//可以像其它函数一样引用
circle *p2=
NULL;
p2=
new circle(0,0,2);
p2->add();
circle::print(*p2);//也可以用类的方式引用
delete p2;
p2=
NULL;
return 0;
}
静态函数其实也是类的静态函数,不是属于对象的
https://blog.51cto.com/nnssll/208243