c++ static修饰符浅析

下面一段是引用自effective c++ 中的一句话:

所谓的static对象,其寿命是从构造出来到程序结束为止(以下文章不再赘诉)。因此stack和heap-base对象都被排除。这种对象包括global对象,定义于namespace作用域内的对象,在classes内,在函数内,以及在file作用域内被声明为static的对象。

所以static在c++中可以存在在一下几种情况:
1.存在于全局作用域中的静态变量

//全局可访问,在内存中只有一份拷贝,可被很多函数修改。
#include <iostream>static int i = 1; //作用域是整个filevoid get(){std::cout << "in func , the i is " << i << std::endl;
}int main(){std::cout << "the i is " << i << std::endl;get();return 0;
}

2.存在于函数当中的静态变量

// 只能在这个函数中才能被调用。
// 函数调用结束后,一般局部变量都被回收了,静态变量还存在
#include <iostream>void get(){static int i = 1;std::cout << "the i is " << i << std::endl;i++;
}int main(){get(); // i = 1get(); // i = 2std::cout << "the i is " << i << std::endl; // 这种是错误的return 0;
}

3.存在于类的成员变量中的静态变量

//其实原理跟函数中的静态变量类似,类实例化出来的对象被销毁后,
// 但是类变量(静态成员变量)还是存在在内存中的
#include <iostream>class Widget{
public:Widget(int i){a = i;  }void get();
private:static int a;  // 声明静态变量
};int Widget::a = 1;  //  由于是类变量不是属于专属于一个对象的,被所有对象共享// 所以需要在类外定义
void Widget::get(){std::cout << "the a is " << a++ << std::endl;
}int main(){Widget w(1);w.get(); // a = 1w.get(); // a = 2return 0;
}

4.存在于类中成员函数中的静态变量

#include <iostream>class widget{public:widget(){}void get();
};void widget::get(){static int i = 1;//成员函数中的静态变量的作用域范围跟普通局部变量的作用域范围是一样的std::cout << "in func, the i is " << i++ << std::endl;
}int main(int argc, char const* argv[])
{widget w1;w1.get();  // in func, the i is 1widget w2;w2.get(); // in func, the i is 2return 0;
}

5.存在于命令空间中的静态变量

#include <iostream>namespace Widget {static int i = 1;  // 在该命名空间可用void get(){std::cout << "the i is " << i++ << std::endl;}
} // namespace Widgetint main (){using namespace Widget;get();  //the i is 1get(); // the i is 2return 0;
}

6.存在于全局作用域的静态函数

// 其实跟一般的函数差不多,
// 但是它将该函数的链接属性限制为内链接,
//只能在本编译单元中使用(也就是本文件),
//不能被extern等在外部文件中引用
static void get(){std::cout << "this is staic global func" << std::endl;
}int main(){get();get();return 0;
}

7.存在于类中的静态函数

#include <iostream>class Widget{public:Widget(int i){a = i;}static void get(); // 声明静态函数private:static int a;int b;
};int Widget::a = 1;
void Widget::get(){std::cout << b << std::endl;   //这是错误的,因为静态函数和静态变量直接能够// Widget::get()调用,不需要实例化,所以不能// 调用只能实例化才能初始化的成员变量。std::cout << a << std::endl; //ok
}int main(){Widget w(1);w.get();return 0;
}

总结:

不管是什么静态变量,它的lifetime是从他被构造出来到程序结束为止。
static类型的变量跟其他普通的变量的不同在于在内存中的存在形式不同,
例如存在于函数中的局部变量,每当调用一次函数,就会产生一个局部变
量,而存在于函数中的静态变量只在该函数第一次被调用时被初始化,然
后,然后在内存只保有一份拷贝

补充

链接属性分为三种:

1. 内链接
2. 外链接

内链接:

static修饰的函数和变量 和 const 修饰的变量(不包含extern)都是内链接,
只能在本文件中使用,即使别的文件定义了相同的变量名也不要紧。

外链接:

没有用static修饰的全局变量或者函数,都是可以作为外链接用extern修饰的全局变量或者函数,也是作为外部链接。还有一个 extern const int i = 1;这也是外部链接,因为extern的作用会覆盖掉const使它成为外链接。

还有一类:局部变量,它的lifetime只是在函数执行期间,所以是没有链接属性的。

常成员函数是不能修改类中成员变量的,但是静态成员变量是类变量,所以可以修改

#include <iostream>class Widget{public:Widget(int i){b = i;}void set() const;private:static int a;int b;
};int Widget::a = 1;
void Widget::set() const{a++; //这是对的,因为是静态成员变量是类变量b++; //错误的,普通成员变量是不能被常函数改变的。}

本文还有许多不足,如果哪里写错了,欢迎批评和指正。

c++ static修饰符浅析相关推荐

  1. java static修饰方法_浅析Java中static修饰符

    1.概述 static关键字的中文意思是静态的,该修饰符可以修饰字段.方法.内部类.使用该关键字修饰的内容,在面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的 ...

  2. java(5)---static修饰符

    static修饰符 static修饰符的特点: 1):static修饰的成员(字段/方法),随着所在类的加载而加载. 当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了. 2 ...

  3. java反编译工具gd gson,浅谈Android中static修饰符,及Gson转String实例

    肯定会很奇怪,为什么要把Gson和Static放一起去讲,因为在开发中,json这个东西是很常用的,不管是格式,还是数据的传递,还是我们与后台之间的交互,都离不开JSON,而今天,是在帮一个同行用ts ...

  4. static修饰符和final修饰符

    static修饰符,修饰方法我们就可以不建立对象之久通过方法名调用. static修饰符,修饰属性属性就成了公共数据,并且数据只有一个.就像一个粉笔,A对象用完了粉笔B对象在用这跟粉笔就是A用剩下的那 ...

  5. 10.0_[Java 封装]-抽象/封装/构造/重载/ static 修饰符

    ################################################## 目录 抽象编程 面向对象设计的过程 类和对象的关系 为什么使用面向对象 this 关键字 类的成员 ...

  6. 面向对象通识14(static修饰符)

    面向对象通识14(static修饰符) static并不是字面意义上"静态"的意思,而是类的意思-- 有static的成员是类成员 没有static的成员是实例成员 //在C语言中 ...

  7. Java中static修饰符的作用

    近日在做网络通信服务器和客户端的Java语言开发,碰到了获取客户端长连接Channel对象,利用唯一对象Client的获取方法getSingleClientInstance(),以为可以得到,但是显示 ...

  8. C++ static 修饰符

    C++ static 修饰符 概述 静态数据成员 引用静态数据成员 用类名访问数据成员 静态成员函数 综合案例 概述 static (静态) 修饰符是用来控制变量的存储方式和可见性的. 静态局部变量存 ...

  9. 什么是static修饰符?

    一.什么是static修饰符 1.static是静态意思,可以修饰成员变量和成员方法 2.static修饰成员变量表示该成员变量在内存中只存储一份,可以被共享访问,修改. 二.成员变量,成员方法的分类 ...

最新文章

  1. POJ 1002题 解题报告
  2. 超卖 100 瓶茅台的事故分析
  3. 操作符offset和seg
  4. 138 张图带你 MySQL 入门!
  5. 优化Flash中的3D模型加载
  6. C++(Leetcode):两数之和
  7. LogManager分析
  8. 通过原码、反码、补码彻底搞清左移、右移、无符号右移
  9. hdu -1251 统计难题(字典树水题)
  10. 京东笔试题:如何实现 MySQL 删除重复记录并且只保留一条?
  11. 多模态机器翻译 | (1) 简介
  12. java 面包屑_java面包屑导航制作
  13. html静态页面存储,页面保存为静态页面
  14. 进制为2的10次方的世界
  15. 计算机网络-字符编码的由来(为什么会有乱码,ASCII、Unicode、GBK和UTF-8字符编码区别)
  16. 40+个精选的VSCode前端插件,总有一款适合你
  17. 12 年前我刷了 500 道,谈谈我的学习感受
  18. C++ 动态库导出函数名乱码及解决
  19. 数学建模选修课笔记——模糊聚类分析
  20. 扛把子级别的Java开源后台管理系统

热门文章

  1. 从零开始学PowerShell(6)获取对象信息
  2. 18. OD-反调试研究,破解反调试,编写反调试
  3. VS中CString与char型数组相互转换问题
  4. 《论文笔记》Multi-UAV Collaborative Monocular SLAM
  5. javascript知识点总结----Function定义
  6. java调用python代码
  7. UVa 1153 Keep the Customer Satisfied 【贪心 优先队列】
  8. Linux Shell 之 我的第一个Shell程序
  9. 手把手教你用Pandas读取所有主流数据存储
  10. vivo真实案例:中台到底解决了什么问题?