关于static和extern,union,enun
2010-07-06 17:38
204 查看
有些东西太傻了,不好意思写在别的地方……
static和extern的例子
-C里的static
--static全局变量
这段代码执行的结果是22
23
1)倘若把file1里的n设置为static,则会报错;
2)若完成第一步后再将file2里的extern去掉,则执行结果22
1
所以,static全局变量的含义在于把该全局变量范围限定在文件内,而extern则是一个声明,表示该全局变量不是此文件初始定义,而是在别的文件里使用的,需要到另一个文件里去查找定义。
--static局部变量
static局部变量在全局数据区保存,只初始化一次,随着定义的函数或语句块结束而结束。
看下面的例子
这样,在两次调用之间可以保存局部变量的值,如果定义一个全局变量来实现,变量就不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
--static函数
在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
定义静态函数的好处:
—C++里的static
关于union
转一个例子来说明
[例7.15]设有一个教师与学生通用的表格,教师数据有姓名,年龄,职业,教研室四项。学生有姓名,年龄,职业,班级四项。
编程输入人员数据, 再以表格输出。
本例程序用一个结构数组body来存放人员数据, 该结构共有四个成员。其中成员项depa是一个联合类型, 这个联合又由两个成员组成,一个为整型量class,一个为字符数组office。在程序的第一个for语句中,输入人员的各项数据,先输入结构的前三个成员name,age和job,然后判别job成员项,如为"s"则对联合depa·class输入(对学生赋班级编号)否则对depa·office输入(对教师赋教研组名)。
关于enum
枚举类型,自动赋值,相当于常量。
静态函数不能被其它文件所用;
其它文件中可以定义相同名字的函数,不会发生冲突
出现在类体外的函数定义不能指定关键字static;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
4000
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
调用类的静态成员函数。
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指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
调用类的静态成员函数。
相关文章推荐
- 【转】关于static和extern的用法
- 关于#include、static、extern、namespace的使用
- 关于static和extern
- 【转载】关于static和extern的用法
- 【转载】关于static和extern的用法
- 关于static和extern的用法
- 关于inline/static inline/extern inline
- 关于关键字static和extern和const
- iOS关于extern、static、const的区…
- 嵌入式编程中关于const,static,extern,volatile的用法
- 关于常见的变量修饰符: const, static, extern, register, auto 的详细解释,使用场合以及注意事项
- 函数 - 关于变量(auto、static、register、extern、volatile、restrict)
- 关于const,static,extern,volatile的用法
- 关于const,static,extern,volatile的用法
- C++:关于static与extern的使用分辨
- 嵌入式编程中关于const,static,extern,volatile的用法
- 分享一道笔试题目--关于static和extern变量的问题
- 分享一道笔试题目--关于static和extern变量的问题
- 嵌入式编程中关于const,static,extern,volatile的用法
- 嵌入式编程中关于const,static,extern,volatile的用法