static内容相关介绍学习

说一下static关键字的作用

  • 当程序执行到函数内部定义的变量时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制,范围扩大,全局变量所有可见)。static 关键字则可以很好的解决这个问题
  • 另外,在 C++ 中,需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见时,可将其定义为静态数据。

面向过程的static

  • 函数中的静态变量

面向对象的static

  • 类中的静态变量
  • 类中的静态成员函数
  • 静态类

1. 全局静态变量  

  • 全局变量前加上关键字static,全局变量就定义成一个全局静态变量.    全局变量,独立于所有函数之外
  • 全局静态变量存储在静态存储区(也叫做全局区),在整个程序运行期间一直存在。
  • 初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
  • 作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。

补充:

  • 定义和声明的区别:从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。既然声明都不分配内存,所以自然也不可能被编译器自动初始化为0了。  先声明后定义
  • 结论:一些全局变量(不管用没用static修饰)或者是使用static中修饰的局部变量在定义的时候都会被编译器自动初始化为0,而在声明的时候任何变量都不会被编译器自动初始化。如static int num;如果放在函数中的任何位置都会被隐式的初始化为0,但是如果是在类的声明中这样写就不会有值。
  • extern关键字的作用是什么?
  • 随笔小记-C++ 隐式初始化和显示初始化,switch下的声明和赋值

2.  局部静态变量

  • 局部变量之前加上关键字static,局部变量就成为一个局部静态变量。     单个函数的变量
  • 内存中的位置:静态存储区
  • 初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
  • 作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变

3. 静态函数

  • 在函数返回类型前加static,函数就定义为静态函数。函数的定义和声明在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用
  • 函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突
  • warning:不要再头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰;

4. 类的静态成员

  • 在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,静态数据成员只存储一处,供所有对象共用
#include <iostream>class Car{
public:Car(){properties++;}void set_value(int value){properties = value;}int get_value(){return properties;}static int properties ;
};
int Car::properties = 0;//需要在main函数的外面进行定义int main(void)
{Car *a = new Car();Car *b = new Car();a->set_value(4);std:: cout << a->get_value() << std::endl;std:: cout << b->get_value() << std::endl;return 0;
}

5. 类的静态函数

  • 静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名
  • 在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员(这点非常重要)。如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);
#include <iostream>class Car{
public:Car(){properties++;}void set_value(int value){properties = value;}static int get_value(){return properties;}static int properties ;
};
int Car::properties = 0;int main(void)
{Car *a = new Car();Car *b = new Car();a->set_value(4);std:: cout << a->get_value() << std::endl;std:: cout << b->get_value() << std::endl;return 0;
}

参考链接

  • C++中的静态成员
  • C++ 栈对象 堆对象 理解
  • C/C++ 中 static 的用法全局变量与局部变量

 

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

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

相关文章

C++STL与泛型编程(2) 第一个C++ STL Application

文章目录STL六大部件STL六大部件代码示例时间复杂度前闭后开区间auto关键字的用法STL六大部件 容器 分配器 算法 迭代器 适配器 仿函数 容器要放东西&#xff0c;东西要占用内存&#xff0c;分配器可支持容器解决内存问题。算法处理容器中的数据。迭代器是容器和算法之间的桥…

codeforces 344A-C语言解题报告

题目网址 题目解析 1.有10和01两种,同性相斥,异性相吸 2.01是1,使用pre去记录前一个,写出所有情况 0110 1001 分为一组 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {int n0;int i0;int c0;int pre-1;int count0;scanf(&…

JAVA 程序执行进行计时,用于验证程序执行的时间

package com.example.algorithm.demo.class1;public class Hello {public static void main(String[] args) {long start System.nanoTime();//程序开始时间System.out.println(start);System.out.println("Hello");long end System.nanoTime();System.out.println…

C++STL与泛型编程__侯捷视频_学习博客_总目录

CSTL与泛型编程 侯捷 &#xff08;1&#xff09;: c重要网站相关 CSTL与泛型编程&#xff08;2&#xff09; 第一个C STL Application&#xff1a; STL六大部件代码示例&#xff0c;容器前闭后开区间&#xff0c;auto关键字的用法示例 CSTL与泛型编程&#xff08;3&#xff0…

codeforces 1030A-C语言解题报告

题目网址 题目解析 1.输入一串数字,如果有1就输出HARD,否则输出EASY 2.勿忘& 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {int n0,i0;int num0;int count0;scanf("%d",&n);for(i;i<n;i){scanf(&quo…

C++STL与泛型编程(3)容器之分类与测试

文章目录容器的分类序列式容器&#xff08;sequence containers&#xff09;代码示例辅助函数array 容器array容器的测试代码测试代码中部分函数解析vector 容器vector 容器的测试代码测试代码中部分函数解析list 容器list 容器的测试代码测试代码中部分函数解析forward_list 容…

codeforces 318A-C语言解题报告

题目网址 题目 1.一个数先奇数从小到大再偶数从小到大(1–n),问第k个数是什么? 2.举例发现规律: 第k个数与n的奇偶无关,使用中间数mid(a1)/2;进行判断,k是奇数还是偶数 奇数:countb*2-1; 偶数:count(b-mid)*2; 3.因为数很大,使用scanf("%lld %lld",&a,&…

C++面试题目

C和C的区别 总览 C是一个结构化语言&#xff0c;它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程&#xff0c;对输入&#xff08;或环境条件&#xff09;进行运算处理得到输出&#xff08;或实现过程&#xff08;事务&#xff09;控制&#xff09;。C&…

C++STL与泛型编程(4)OOP(面向对象编程) Vs. GP(泛型编程)

文章目录OOP和GP为什么list不能使用标准库中的::sort算法&#xff1f;采用GP的好处OOP和GP OOP将datas和methods关联在一起 GP将datas和methods分开 为什么list不能使用标准库中的::sort算法&#xff1f; 因为标准库的sort的算法用到了随机访问迭代器&#xff08;RandomAcce…

codeforces 158B-C语言解题报告

题目网址 题目解析 参考博客 代码 #include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<math.h> using namespace std; int n,a[100005]; long long sum,s1,s2,s3;main() {cin>>n;for(int i1;i<…

ECC 公钥加密 使用相同的ECC公钥对 对 相同的数据进行加密,每次的加密结果是一致的吗?

ECC 公钥加密 使用相同的ECC公钥对 对 相同的数据进行加密&#xff0c;每次的加密结果是一致的吗&#xff1f;不一致里面包装了个临时的点&#xff0c;使用这个增加安全性

C++ primer 第7章 类

成员函数的声明必须在类的内部&#xff0c;定义则既可以在类的内部&#xff0c;也可以在类的外部。 作为接口组成部分的非成员函数&#xff0c;它们的定义和声明都在类的外部。 类可以允许其他类或者函数访问它的非公有成员&#xff0c;方法是令其他类或函数成为它的友元。如果…

codeforces 705A-C语言解题报告

题目网址 题目解析 1.重点:结尾是it,中间使用that连接,所以使用for循环,奇数输出I hate,偶数输出I love,i!n时,输出that 代码 #include<stdio.h> #include<stdlib.h> #define SIZE 100000 int main() {int n0;scanf("%d",&n);if(n1){printf(&quo…

牛客网 链表结构 算法相关内容

链表结构 单链表的节点结构 由以下结构的节点依次连接起来所形成的链叫单链表结构 Clas Node<V>{ V value; Node next; } 双链表的节点结构 由以下结构的节点依次连接起来所形成的链叫双链表结构 Clas Node<V>{ V value; Node next; Node last; } 单链表和双…

C++ primer 第8章 IO库

文章目录IO库类型和头文件IO对象无拷贝或赋值IO流的条件状态文件输入输出ifstream 示例ofstream 示例文件模式以out模式打开文件会丢弃已有数据每次调用open时都会确定文件模式ofstream 保留源文件 追加数据 示例string流istringstream示例ostringstream示例IO库类型和头文件 …

codeforces 486A-C语言解题报告

题目网址 题目解析 1.f(n)(-1)^nn 2.使用long long int 3.总结找出规律: if(i%2!0) return -1(i1)/2; else return i/2; 直接暴力求解—超时 #include<stdio.h> #include<stdlib.h> // TIME_LIMIT_EXCEEDED,此方法不行,超时 //注意规律&#xff01;&#xff01…

C++面试宝典 基本语言(三)

如果同时定义了两个函数&#xff0c;一个带const&#xff0c;一个不带&#xff0c;会有问题吗&#xff1f; 不会&#xff0c;这相当于函数的重载 #include<iostream> class A{ public:void print()const{std::cout << "Hello" << std::endl;}void…

C++ primer 第9章 顺序容器

文章目录顺序容器类型确定使用哪种顺序容器容器库概览容器操作迭代器迭代器支持的所有操作迭代器支持的所有运算迭代器范围对构成范围的迭代器的要求标准库迭代器范围左闭右开的三种性质容器定义和初始化将一个新容器创建为另一个容器的拷贝将array拷贝到vector中的代码与顺序容…

常用单位换算

字节单位换算 B(byte)字节 bit 位 1B 8 bit 1KB&#xff08;Kilobyte&#xff0c;千字节&#xff09;1024B 2^10 B&#xff1b; 1MB&#xff08;Megabyte&#xff0c;兆字节&#xff0c;百万字节&#xff0c;简称“兆”&#xff09;1024KB 2^20 B&#xff1b; 1GB&#xf…

牛客网C++面经 容器和算法

原文网址 参考网址 C语言中文网 请你来说一下map和set有什么区别&#xff0c;分别又是怎么实现的&#xff1f; map和set都是C的关联容器&#xff0c;其底层实现都是红黑树&#xff08;RB-Tree&#xff09;。由于 map 和set所开放的各种操作接口&#xff0c;RB-tree 也都提供…