C++中的static使用
2014-03-09 23:36
369 查看
C++的static可以控制存储和可见性。
static基本含义:
1、静态存储。在静态数据区上创建,而不是每次函数调用时在堆上产生。
2、控制连接。static控制名字的可见性(visibility),对于特定的编译单位来说是局部的,所以这个名字在这个文件单元或者类之外是不可见的。
1、静态存储
用法:
函数内的静态变量:可以在函数调用之间保留一个变量的值,由于静态变量存储在静态数据区中,可以在调用之间保持它的值。
如果没有为一个内部的静态变量提供一个初始值,编译器会确保在程序开始时他被初始化为0(转化为适当的类型)。对于函数中的静态变量,既然是为了隐藏,就在函数体内声明的时候定义:如 static char* s = NULL; ,初始化只且仅会在函数第一次调用时执行一次。
a) C++中的静态数据成员存储
之后必须在定义文件中为静态数据成员定义存储区:
A::i定义为私有的依然可以初始化,因为其只有定义时才可这么初始化,保证了绝对安全。如果静态数据成员是一个带构造函数的对象,可以调用定义的构造函数来代替 = ,如果没有,会调用默认的。
若为静态常量,可以在类体内定义。如static int i = 1;
当静态数据成员为数组时,初始化必须在外部进行定义。
如:
b) 静态成员函数
静态成员函数为类的全体对象服务,减少了全局名字空间的占用,需要用任何具体的对象。
当然也可以用对象来访问。
static 成员函数只能访问静态数据成员和静态成员函数。对于一个对象来说,当前对象的地址this被隐式地传递到函数,但静态成员函数没有this,所以无法访问一般的成员。
c)一个有趣的使用
可以把一个类的静态数据成员放到此类的内部,然后把构造函数和拷贝构造函数(手动增加)设置为私有的,这样一个类只有唯一的对象,可以访问,却不能产生任何新的对象。
2、控制连接。
一般情况下,文件作用域内的所有名字(即不嵌套在类或者函数中的名字)对程序中的所有翻译单元来说都是可见的,也即是外部的(extern)。全局变量和普通函数都是外部连接。
若只想让一个变量在文件范围内是可见的,而不与外部的标识符冲突,可以声明为 static 对象或函数,这些名字是内部连接。
static基本含义:
1、静态存储。在静态数据区上创建,而不是每次函数调用时在堆上产生。
2、控制连接。static控制名字的可见性(visibility),对于特定的编译单位来说是局部的,所以这个名字在这个文件单元或者类之外是不可见的。
1、静态存储
用法:
函数内的静态变量:可以在函数调用之间保留一个变量的值,由于静态变量存储在静态数据区中,可以在调用之间保持它的值。
如果没有为一个内部的静态变量提供一个初始值,编译器会确保在程序开始时他被初始化为0(转化为适当的类型)。对于函数中的静态变量,既然是为了隐藏,就在函数体内声明的时候定义:如 static char* s = NULL; ,初始化只且仅会在函数第一次调用时执行一次。
a) C++中的静态数据成员存储
class A{ static int i; public: // ... };
之后必须在定义文件中为静态数据成员定义存储区:
int A::i = 1;
A::i定义为私有的依然可以初始化,因为其只有定义时才可这么初始化,保证了绝对安全。如果静态数据成员是一个带构造函数的对象,可以调用定义的构造函数来代替 = ,如果没有,会调用默认的。
若为静态常量,可以在类体内定义。如static int i = 1;
当静态数据成员为数组时,初始化必须在外部进行定义。
如:
class X{ int i; public: X (int ii):i(ii){} }; class Stat{ static X x1; staic X xtable[]; }; X Stat::x1(100); X Stat::xtable[]={X(1), X(2), X(3)}; int main(){ Stat v; //~ return 0; }
b) 静态成员函数
静态成员函数为类的全体对象服务,减少了全局名字空间的占用,需要用任何具体的对象。
class X{ public: static void f(){}; }; int main(){ X::f(); //~ }
当然也可以用对象来访问。
static 成员函数只能访问静态数据成员和静态成员函数。对于一个对象来说,当前对象的地址this被隐式地传递到函数,但静态成员函数没有this,所以无法访问一般的成员。
c)一个有趣的使用
可以把一个类的静态数据成员放到此类的内部,然后把构造函数和拷贝构造函数(手动增加)设置为私有的,这样一个类只有唯一的对象,可以访问,却不能产生任何新的对象。
class Egg{ static Egg e; int i; Egg(int ii):i(ii){} Egg(const Egg&);// prevent copy-construction public: static Egg* instance(){return &e}; int val() const{ return i; } }; Egg Egg::e(47); int main(){ // Egg x(1); //Error cout<<Egg::instance()->val()<<endl; //~ }
2、控制连接。
一般情况下,文件作用域内的所有名字(即不嵌套在类或者函数中的名字)对程序中的所有翻译单元来说都是可见的,也即是外部的(extern)。全局变量和普通函数都是外部连接。
若只想让一个变量在文件范围内是可见的,而不与外部的标识符冲突,可以声明为 static 对象或函数,这些名字是内部连接。
相关文章推荐
- 《C++对象模型》读后感——前言
- c语言初学者学习的事儿
- java学习之C语言基础2
- 冒泡排序
- C++ 虚函数和纯虚函数总结
- 关于C++默认打开函数的理解
- C语言从尾部节点开始生成链表
- C++类的内存布局
- C语言实现单链表的生成打印查找删除逆置排序
- C++程序设计
- 使用C++语言模拟实现贪吃蛇小游戏
- 图论学习笔记之一——Floyd算法
- Hibernate内置的
- C++练习——2014/3/9
- C++ STL map
- C++ 虚函数表解析
- C++ primer -容器篇
- C++ primer -函数篇
- C语言中求整型数组中的最大值!~~~~(黄为,刘佳琪)
- 机器人行走java代码,稍后附上C语言代码,取余数若为负可以加倍数成正数