您的位置:首页 > 其它

关于static和extern,union,enun

2010-07-06 17:38 204 查看
有些东西太傻了,不好意思写在别的地方……

 

static和extern的例子

 

-C里的static

 

--static全局变量

 
//这也算是抄袭的一个例子:)
//file1
#include<iostream>
using namespace std;
int n;
void fn();
int main()
{
n=22;
cout<<n<<endl;
fn();
}
//file2
#include<iostream>
using namespace std;

extern int n;
void fn()
{
n++;
cout<<n<<endl;
system("pause");
}


 

这段代码执行的结果是22

                              23

1)倘若把file1里的n设置为static,则会报错;

2)若完成第一步后再将file2里的extern去掉,则执行结果22

                                                                               1

所以,static全局变量的含义在于把该全局变量范围限定在文件内,而extern则是一个声明,表示该全局变量不是此文件初始定义,而是在别的文件里使用的,需要到另一个文件里去查找定义。

 

--static局部变量

 

static局部变量在全局数据区保存,只初始化一次,随着定义的函数或语句块结束而结束。

看下面的例子

 
#include <iostream>
using namespace std;
void fn();
void f1();
void main()
{
fn();
fn();
fn();
f1();
}
void fn()
{
static int n=10;
cout<<n<<endl;
n++;
}


这样,在两次调用之间可以保存局部变量的值,如果定义一个全局变量来实现,变量就不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

 

--static函数

 

在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

 

定义静态函数的好处:

—C++里的static

 

 

 
#include <iostream>
using namespace std;

class myclass{
public:
myclass(int a,int b,int c);
static void getsum();
private:
int a,b,c;
static int sum;//对于所有对象来说,sum值是唯一的,共有的
};

int myclass::sum=0;

myclass::myclass(int a, int b, int c)
{
this->a=a;
this->b=b;
this->c=c;
sum+=a+b+c;
}

void myclass::getsum()
{
//cout<<a<<endl;//静态成员函数只能调用静态成员变量
cout<<"sum="<<sum<<endl;
}

int main()
{
myclass class1(1,2,3);
class1.getsum();//输出6
myclass class2(2,3,4);
class2.getsum();//输出15
class1.getsum();//输出15
myclass::getsum();//静态成员函数的另一种调用方法
system("pause");
return 0;
}


 

 

 

关于union

 

转一个例子来说明

[例7.15]设有一个教师与学生通用的表格,教师数据有姓名,年龄,职业,教研室四项。学生有姓名,年龄,职业,班级四项。 
编程输入人员数据, 再以表格输出。

 

main()
{
struct
{
char name[10];
int age;
char job;
union
{
int class;
char office[10];
} depa;
}body[2];
int n,i;
for(i=0;i<2;i++)
{
printf("input name,age,job and department/n");
scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);
if(body[i].job=='s')
scanf("%d",&body[i].depa.class);
else
scanf("%s",body[i].depa.office);
}
printf("name/tage job class/office/n");
for(i=0;i<2;i++)
{
if(body[i].job=='s')
printf("%s/t%3d %3c %d/n",body[i].name,body[i].age ,body[i].job,body[i].depa.class);
else
printf("%s/t%3d %3c %s/n",body[i].name,body[i].age, body[i].job,body[i].depa.office);
}
}


 

 

本例程序用一个结构数组body来存放人员数据, 该结构共有四个成员。其中成员项depa是一个联合类型, 这个联合又由两个成员组成,一个为整型量class,一个为字符数组office。在程序的第一个for语句中,输入人员的各项数据,先输入结构的前三个成员name,age和job,然后判别job成员项,如为"s"则对联合depa·class输入(对学生赋班级编号)否则对depa·office输入(对教师赋教研组名)。 

 

关于enum

 

枚举类型,自动赋值,相当于常量。

 

#include <iostream>
using namespace std;

enum child
{
boy=2,
girl
};

int main()
{
child newchild;
newchild=girl;
cout<<newchild<<endl;
system("pause");
}


 

静态函数不能被其它文件所用;

其它文件中可以定义相同名字的函数,不会发生冲突

出现在类体外的函数定义不能指定关键字static;

静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

4000

非静态成员函数可以任意地访问静态成员函数和静态数据成员;

静态成员函数不能访问非静态成员函数和非静态数据成员;

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
调用类的静态成员函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息