C++对象的使用

static成员的使用:

对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。

如果我们使用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来解决这个问题。

非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。

static成员变量是被共享的,整个类只有一个静态成员。静态成员变量要在实现文件(文件作用域)中进行初始化。定义中不需要加static了。

私有静态成员的话需要一个函数接口进行访问。

static   const  int成员可以直接在类体内进行初始化。仍需在外部进行定义。

static成员函数没有this指针。

非静态成员函数可以访问static成员与函数。

静态成员函数不可以访问非static成员与函数。



作用域与生存期不等同,new出来的对象分配在堆上,需要用delete进行显示释放。栈上的对象在作用域结束后生存期也自动释放。


未初始化的全局变量与局部静态变量存储在.bss段。初始化的全局变量与局部静态变量存储在.data段,在编译期初始化。静态类对象在运行期初始化,存储与.data段中。在整个程序运行完释放。

静态局部变量只分配一次内存,不可重入的。静态全局变量与全局变量区别就在于静态变量只分配一次内存,整个值是一致的。全局变量在文件作用域中可以有不同的值。


在不同文件中需要共用一个变量,需要用extern进行声明。


全局变量要在.c文件中定义。

在头文件中定义了一个变量,若另一个文件包含此文件则会再产生一个相同变量的定义,在linux环境中编译时会发生如

menu.o:(.sbss+0x0): multiple definition of `is_refresh_living_time_thread_created'
main.o:(.sbss+0x0): first defined here

的错误,要在包含该文件的文件中使用此变量应该声明全局变量“extern int is_refresh_living_time_thread_created”,或者叫作“通过extern关键字扩展全局变量is_refresh_living_time_thread_created的作用范围(即扩展到包含该文件的文件中)”;这和头文件中的函数声明不同,因为函数在头文件中仅仅是声明,声明可以有多个,但是无论是函数还是变量定义都只能有一个,否则就会发生重复定义的错误。

      头文件中变量如果没有初始化就是声明;初始化了就是定义,此时被包含之后会发生重复定义的错误。

      并不是所有的变量都能用extern声明,只有全局变量并且没有被static 声明的变量才能声明为extern. 所以如果你不想自己源文件中全局的变量被其他文件引用,你就可以给变量加上static声明.

     

    很多初学者,对变量的定义和声明分不请,只知道有这回事。下面对这两个概念详细说明下:

变量的定义:为变量分配存储空间,同时指明变量的类型和名字。另外变量的初始化,就是在变量的定义出给出值。

变量的声明:它主要向程序声明变量的类型和名字。定义也是声明(这是许多人搞不清楚的地方),那既然变量的定义就是声明,为啥还要再多出来个变量的声明这个概念,直接就用变量的定义不是就可以了?

其实不然,C++中有个关键字是用来声明变量的,它是extern。它声明一个变量却不定义它,即不在给它一个存储空间。

例如:int i;//定义也可以说是声明

extern int i;//这就是单纯的声明

注意:在C++语言中,变量有且只能有一次定义,但是可以声明多次,使用变量前必须定义或声明。

这依然没有说明这个变量声明有什么作用,下面就举个例子说明变量声明的作用

假设我们在文件1.cpp中定义了一个全局变量bufsize,文件1.cpp中当然可以访问它,如果我想在另外一个文件2.cpp中访问这个全局变量,这时候需要在文件2.cpp中声明这个变量。

//1.cpp

int bufsize;

//2.cpp

extern int bufsize;

这说的是非const的全局变量,如果是const的全局变量,如果想要被其他文件访问,需要在定义的时候,加上extern关键字,表示它可以在其他文件被声明使用的,即可以被整个程序(一个程序可能包括多个源文件)访问,否则的话,这个变量只能在它被定义的文件里面被访问,其他文件不能访问。

//1.cpp

extern const int bufsize=10;

//2.cpp

extern const int bufsize;

这时候你也许会问,为什么非const变量定义的时候为什么没有extern?

答:非const变量默认为extern。而const变量如果想要在其他文件里被访问,必须显示的指定它为extern。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值