C++ 静态对象

一:什么是静态对象?

对象的存储方式是静态的。

局部静态对象和类的静态对象。

局部静态对象:一个变量在函数内部定义,其生命周期跨越了该函数的多次调用。局部对象确保不迟于在程序执行流第一次经过该对象的定义语句时进行初始化。这样的对象一旦被创建,在程序结束之前都不会销毁。在定义局部静态对象的函数执行完毕后,该静态对象不会撤销。当该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值。

静态成员对象:静态成员对象存储在全局存储区,静态成员对象的作用域在类的作用域中。其可以避免与其他类成员或全局对象名字冲突。可以封装为私有的,而全局对象不可以。

二:定义及初始化

允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

  • 局部静态对象:
  1. int fun(int i)
  2. {
  3. static int a = 10;
  4. a = a+i;
  5. return a;
  6. }
  7. int main(int argc, char *argv[])
  8. {
  9. for(int i=0;i<3;i++)
  10. {
  11. cout <<fun(i)<<endl;
  12. }
  13. }

  • 静态类成员对象

声明:类的静态成员变量声明前加static,其也遵守公有/私有访问规则。因为 static 成员不是任何对象的组成部分,所以不能通过构造进行初始化。应该单独进行定义并进行初始化。

  1. class Account {
  2. public:
  3. // interface functions here
  4. void applyint() { amount += amount * interestRate; }
  5. static double rate() { return interestRate; }
  6. static void rate(double); // sets a new rate
  7. private:
  8. std::string owner;
  9. double amount;
  10. static double interestRate;
  11. static double initRate();
  12. }; 这个类的每个对象具有两个数据成员:owner 和 amount。对象没有与 static 数据成员对应的数据成员,但是,存在一个单独的 interestRate 对象, 由 Account 类型的全体对象共享。

static 数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。

定义:在函数定义的文件中进行定义,定义的格式:

类型名  类名::对象名=值;(前面不能再有static,static 关键字只能用于类定义体内部的声明中)

  1. double Account::interestRate = initRate();

这个语句定义名为 interestRate 的 static 对象,它是类 Account 的成员,为 double 型。作用域符后面的表明都是在该类的作用域下,因此可以直接使用initRate()函数。注意,虽然initRate是私有的,我们也能用它初始化interestRate。和其他的成员一样,interestRate的定义也可以在访问类的私有成员。

访问/调用:

在该变量所属类的成员函数里直接可以使用,在其他文件中通过

类名::函数名/变量

三、全局静态对象与全局变量的区别

全局变量前面加上static就变成了全局变量。全局变量本身就是静态存储方式,静态全局变量也是静态存储方式。两者的区别是,非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态全局变量在各个源文件中均可访问。而静态全局变量只有在定义该静态全局变量的文件中可用,在同一源程序的其他源文件中不可访问。因此可避免在其他源文件中的引起错误。

把局部变量变为静态变量后,改变了其生命周期。把全局变量变为静态全局变量,改变了其作用域,限制了其使用范围。

四、应用

static成员变量最经典的用法就是设计模式中的单例模式了。在下篇文章中,我会指出单例模式的三种写法,及其优缺点。

来自为知笔记(Wiz)

时间: 2024-10-14 14:01:20

C++ 静态对象的相关文章

用JAVASCRIPT实现静态对象、静态方法和静态属性

Javascript语言的面向对象特征很弱,其他面向对象语言在创建类时只要使用关键字static即可指定类为静态类,Javascript没有提供static这样的关键字,要让Javascript也具有"静态"特性只有靠一些"奇技淫巧"了. 代码中列举了两种静态方法/属性的实现方式,一种是静态类的静态方法和属性,另一种是非静态类的静态方法和属性,代码说明都写在每行的代码注释里,这里就不重复了. /************************************

十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象传入即可.但是在Activity中不能传递监听对象,所以考虑使用广播来实现. public void login(final LoginOnClickListener listener) { Intent intent = new Intent(context, LoginActivity.clas

静态对象与非静态对象

Java静态对象和非静态对象有什么区别?? 静态对象                                                        非静态对象      是类共同拥有的.                                          是类独立拥有的, 内存空间上是固定的                                              空间在各个附属类里面分配 先分配静态对象的空间                   

bind君不可能干掉静态对象

bind也不是啥新东西了 我一直使用箭头函数代替它的某些功能 也觉得它挺简单的 没做过多的研究 最近发现bind还会帮你做奇怪的事情 不光只是bind了 如下 const x = x=>{x}; x.prop = 'x'; const x2 = x.bind({}); //undefined console.log(x2.prop) 发现x函数上的静态属性被移除了 这并不是我想要的!有些时候 我们就是希望函数上的静态属性被继承下来! 可以这么做  把属性丢到上层原型链中 const x = x=

[整理]C语言中的static静态对象

1.说明外部对象(静态外部变量和静态函数)    (1)static 用于说明外部变量或函数,使该对象的作用域限定为被编译原文件的剩余部分,即从对象说明开始到所在源文件的结束部分:    (2)被static说明的外部对象对于其他的源文件是隐藏的,也就是说其他源文件无法访问得到:    (3)不会和同一程序的其他源文件中的同名的外部对象发生命名冲突. 2.说明内部变量(静态内部变量)    (1)和自动变量一样,作用域为某个特定的函数:    (2)和自动变量不同的是,不管其所在的函数是否被调用

spring学习——注入静态对象属性

spring注入静态对象属性时,因为虚拟机类加载问题,直接在属性上使用@Autowired 是不可以的.需要在属性对应的set方法上@Autowired,并且,set方法不能定义为static. 1.创建静态对象属性对应的类 package com.bluej.springj.service.impl; import org.springframework.stereotype.Service; import com.bluej.springj.service.LogService; @Serv

C++ Daily 《6》---- 类静态对象与函数静态对象

C++ 的一个哲学基础是,你不应该为你使用的东西付出代价. class 拥有一个 static 成员,即使从未被用到,它也会被构造和析构: 而 函数拥有一个 static 成员, 如果这个函数从未被调用,则这个对象不会被构造. 做个简单的实验: 结果是没有调用构造函数,因为 thePrinter函数并没有被调用. 相反,类中的一个static 成员,一定会被构造, 因为类的static 成员独立于对象而存在,因此无论是否定义了这个类的对象, static 成员都会构造出来. C++ Daily

Unity3D静态对象优化系列三

我们接着系列二的问题继续讲解,系列二中的问题是如果多个材质是相同的,它没有去优化,接下来我们将其优化一下,首先要找到在哪里去优化,我们看下面的for循环语句也是系列二的代码,如下:                 for (int s = 0; s < meshFilter.sharedMesh.subMeshCount; s++)                 {                     int materialArrayIndex = 0;                 

条款47: 确保非局部静态对象在使用前被初始化

class FileSystem { ... }; // 这个类在你 // 的程序库中 FileSystem theFileSystem; // 程序库用户 // 和这个对象交互 ////////////////////////////////////////////////////////// class Directory { // 由程序库的用户创建 public: Directory(); ... }; Directory::Directory() { 通过调用theFileSystem