C++学习——static

文章目录

    • 1. static的用法和作用?
    • 2.静态变量什么时候初始化

1. static的用法和作用?

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。用static修饰的变量的声明式即为其定义式。如果没有手动的初始化,系统会为该变量提供一个初始值。 但是static变量最好在使用的编译单元里(.c/.cpp)声明定义,如果定义在头文件里,如果头文件被重复引用讲导致变量的重复定义。

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

3.static的第三个作用是默认初始化为0(static变量)

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

static的作用

4.static的第四个作用:C++中的类成员声明static

1)   函数体内static变量的作用范围为该函数体,不同于auto变量,
该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;  
#include<iostream>
using namespace std;class solution {
public:int a;void print() {static int s = 100;cout << s << endl;s++;}
};int main() {solution D1;for (int i = 0; i < 5; i++) {D1.print();}return 0;
}
100
101
102
103
104
2)   static修饰的类的成员变量必须要在类外初始化,
static修饰的类成员函数,既可以在类内定义,又可以在类外定义。
#include<iostream>
using namespace std;class solution {
private:static int s;
public:static void print() {cout << "static print" << endl;}//类的静态成员函数可以在类内进行定义
};int solution::s = 1200;//在类的静态成员变量必须在类外进行初始化。int main() {solution D1;D1.print();return 0;
}
3)   在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;   
#include<iostream>
using namespace std;class solution {
private:static int s;
public:static void print() {cout << "static print" << s << endl;}void pprint() {cout << "pprint" << s << endl;}void ppprint();
};int solution::s = 1200;void solution::ppprint() {cout << "ppprint" << s << endl;
}
int main() {solution D1;D1.print();D1.pprint();D1.ppprint();return 0;
}
static print1200
pprint1200
ppprint1200
4)   在模块内的static函数只可被这一模块内的其它函数调用,
这个函数的使用范围被限制在声明它的模块内;   5)   在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;   6)   在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,
因而只能访问类的static成员变量。
7)   由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,
this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,
只能访问 static修饰的类成员;8)   static成员函数不能被virtual修饰,static成员不属于任何对象或实例,
所以加上virtual没有任何实际意义;
静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,
而vptr是通过this指针调用的,所以不能为virtual;
虚函数的调用关系,this->vptr->ctable->virtual function

2.静态变量什么时候初始化

  1. 初始化只有一次,但是可以多次赋值,在主程序之前,编译器已经为其分配好了内存。

  2. 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。

  3. 而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘...

来源&#xff1a;神经科技编辑&#xff1a;Yezi审阅&#xff1a;mingzlee7前不久&#xff0c;谷歌和哈佛大学联手发布人脑神经3D连接图&#xff0c;涵盖人脑一百万分之一的信息&#xff0c;但数据已经塞满了1400块1T硬盘&#xff01;现在&#xff0c;这个研究团队表示&#xff…

python replace()

转载于:https://www.cnblogs.com/JackFang-X/p/11090449.html

C++学习——const

文章目录1.const的作用2.const成员函数的理解和应用&#xff1f;1.const的作用 1. 阻止一个变量被改变&#xff0c;可以使用const关键字。在定义该const变量时&#xff0c;通常需要对它进行初始化&#xff0c;因为以后就没有机会再去改变它了&#xff1b; #include<iostre…

解决表单提交的数据丢失问题

解决表单提交的数据丢失问题&#xff1a; 一、问题描述&#xff1a; 当我们在给前台页面设置修改功能的时候&#xff0c;因为有些信息是不允许进行修改的&#xff0c;所以在修改表单中没有相应的修改输入框&#xff0c;但是在修改表单的数据提交的时候&#xff0c;那些不允许修…

科学家即将揭示人类大脑神经网络结构的奥秘

来源&#xff1a;今日头条人类即将迎来了解大脑神经网络结构神秘世界的曙光&#xff01;哈佛大学神经科学家和谷歌工程师&#xff0c;发布了第一张人类大脑部分的神经网络连接图&#xff0c;大约针头大小的人类大脑组织用重金属染色&#xff0c;切成 5,000&#xff0c;并在电子…

C++学习—— mutable和 extern

文章目录1. mutable2.extern用法&#xff1f;1. mutable 1) 如果需要在const成员方法中修改一个成员变量的值&#xff0c;那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制; 常成员函数&#xff0c;不允许修改成员变量的值&#xff0c…

温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...

来源&#xff1a;AI科技评论作者&#xff1a;Mr Bear编辑&#xff1a;青暮2021 年 10 月 13 日&#xff0c;来自麻省理工学院、加州大学伯克利分校、伊利诺伊大学香槟分校、华盛顿大学、帝国理工学院的六名顶级人工智能科学家、计算机视觉科学家在 ICCV 2021 大会期间进行了题为…

20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK

demo代码如下: private void btnPrint_Click(object sender, EventArgs e){if (this.btnPrint.Text "停止打印"){SetBtnPrintUIEnable();return;}//禁用界面上的相关按钮SetBtnPrintUIDisable();var dt new DataTable(); new Task(() >{///开始的打印//1. 获取…

C++学习——string

文章目录1.int转字符串字符串转int?2.strcat,strcpy,strncpy,memset,memcpy的内部实现&#xff1f;1.int转字符串字符串转int? 例:"123"123#include<iostream> #include<string> using namespace std;string string_head_end(string str) {string s&q…

卷积神经网络(CNN)数学原理解析

来源&#xff1a;图灵人工智能作者&#xff1a;Piotr Skalski编辑&#xff1a;python数据科学原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural Networks翻 译&#xff1a; 通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#…

仅模糊背景图像而不是前面的文本

正如标题所说。 如何模糊容器的背景图像而不模糊前面的文本&#xff1f; <div class"card"> <div class"head"> <div class"title"> <span>Card Title</span> </div> </div> <div class"body…

C++学习——模板

文章目录1.C模板2.C模板是什么&#xff0c;底层怎么实现的&#xff1f;1.C模板 模板是泛型编程的基础&#xff0c;泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。 库容器&#xff0c;比如迭代器和算法&#xff0c;都是泛型编程的例…

【数据结构基础】-串-顺序结构的基本操作实现

2019.10.12 数据结构中串的基本操作实现&#xff0c;包括串的定义&#xff0c;串的初始化&#xff0c;赋值&#xff0c;获取串的长度&#xff0c;串的比较&#xff0c;连接串&#xff0c;求子串&#xff0c;清空串。 语言&#xff1a;c语言 运行环境&#xff1a;dev #include &…

大脑研究正在挑战超级计算,“人脑计划”或需提前部署百亿亿级超级计算机...

来源&#xff1a;DeepTech深科技人脑的复杂性正推动着超级计算释放更多的潜力。据了解&#xff0c;人脑包含大约 860 亿个神经元&#xff0c;可形成数万亿个接触点。如果以细胞分辨率对整个大脑进行成像&#xff0c;甚至会产生数 PB 范围内的数据&#xff0c;这样的的计算量令人…

02 算术、字符串与变量(1)

本章内容 1、交互式命令shell 2、整数算术 3、浮点算术 4、其他数学函数 5、字符串 6、字符串拼接 7、获取帮助 8、类型转换 9、变量和值 10、赋值语句 11、变量如何引用值 12、多重赋值 -------------------------------------- 在学习Python前&#xff0c;我们需要了解数据类…

C++学习——c语言和C++语言中的struct

C语言struct和Cstruct区别 C语言中&#xff1a;struct是用户自定义数据类型&#xff08;UDT&#xff09;&#xff1b; C中struct是抽象数据类型&#xff08;ADT&#xff09;&#xff0c;支持成员函数的定义&#xff0c;&#xff08;C中的struct能继承&#xff0c;能实现多态&am…

【数据结构基础】-线性表的顺序实现(数组实现)基本操作

2019.10.10 【数据结构-线性表的顺序结构】 基本操作&#xff1a;初始化&#xff0c;判断是否空表&#xff0c;清空表&#xff0c;获取表中的第i个元素&#xff0c;查找元素&#xff0c;插入元素&#xff0c;删除元素&#xff0c;获取表的元素个数。 抽象数据类型&#xff1a…

机器学习驱动技术是生物学进步的下一个突破

来源&#xff1a;ScienceAI作者&#xff1a;Immunai 联合创始人兼 CEO&#xff0c;Luis Voloch编译&#xff1a;绿萝数字生物学与 90 年代的互联网处于同一发展阶段&#xff08;早期、激动人心和变革性&#xff09;。当时&#xff0c;IP 地址的概念还很新&#xff0c;「精通技术…

makefile编译erlang

https://www.cnblogs.com/witton/p/6868963.html转载于:https://www.cnblogs.com/hshy/p/11096625.html

C++学习——内联函数

文章目录1.内联函数1.1 什么是内联函数1.2 内联函数的声明1.3 内联函数的条件2.成员函数与内联函数2.1 内联成员函数2.2 判断成员函数时候为内联函数3. 虚函数可以声明为inline吗1.内联函数 1.1 什么是内联函数 C提供一种提高函数效率的方法&#xff0c;即在编译时将被调函数…