static那些事(代码片段)

ljwgis ljwgis     2022-12-01     659

关键词:

static那些事

当与不同类型一起使用时,static关键词具有不同的含义。

静态变量:函数中的变量、类中的变量

静态类的成员:类对象和类中的函数

静态变量

  1. 函数中的静态变量

当变量声明为static时,空间将在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也只分配一次前次调用的变量值通过下一次函数调用传递

#include <iostream> 
#include <string> 
using namespace std; 

void demo() 
 
    // static variable 
    static int count = 0; 
    cout << count << " "; 

    // value is updated and 
    // will be carried to next 
    // function calls 
    count++; 
 

int main() 
 
    for (int i=0; i<5; i++)  
        demo(); 
    return 0; 
 

您可以在上面的程序中看到变量count被声明为static。因此,它的值通过函数调用来传递每次调用函数时,都不会对变量计数进行初始化

  1. 类中的静态变量

由于声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量由对象共享。对于不同的对象,不能有相同静态变量的多个副本。也因此,静态变量不能使用构造函数初始化。

#include<iostream> 
using namespace std; 

class Apple 
 
public: 
    static int i; 

    Apple() 
     
        // Do nothing 
    ; 
; 

int main() 
 
Apple obj1; 
Apple obj2; 
obj1.i = 2;  //并没有成功创建副本,类的静态成员存在于任何对象之外
obj2.i = 3;  //并没有成功创建副本

// prints value of i 
cout << obj1.i<<" "<<obj2.i; 
 

您可以在上面的程序中看到我们已经尝试为多个对象创建静态变量i的多个副本。但这并没有发生。因此,类中的静态变量应由用户使用类外的类名和范围解析运算符显式初始化,如下所示:

#include<iostream> 
using namespace std; 

class Apple 
 
public: 
    static int i; 

    Apple() 
     
        // Do nothing 
    ; 
; 

int Apple::i = 1; 
//类中的静态变量应由用户使用类外的类名和范围解析运算符显式初始化

int main() 
 
    Apple obj; 
    // prints value of i 
    cout << obj.i; 
 

静态成员

类对象为静态

就像变量一样,对象在声明为static时候具有范围,直到程序的生命周期结束

#include<iostream> 
using namespace std; 

class Apple 
 
    int i; 
    public: 
        Apple() 
         
            i = 0; 
            cout << "Inside Constructor
"; 
         
        ~Apple() //析构函数,在对象消亡时,被自动调用
         
            cout << "Inside Destructor
"; 
         
; 

int main() 
 
    int x = 0; 
    if (x==0) 
     
        Apple obj; //生命周期为if语句块内
     
    cout << "End of main
"; 
 
输出:
Inside Constructor
Inside Destructor
End of main

对象在if块内声明为非静态。因此,变量的范围仅在if块内。因此,当创建对象时,将调用构造函数,并且在if块的控制权越过析构函数的同时调用,因为对象的范围仅在声明它的if块内。

如果我们将对象声明为静态,现在让我们看看输出的变化。

#include<iostream> 
using namespace std; 

class Apple 
 
    int i; 
    public: 
        Apple() 
         
            i = 0; 
            cout << "Inside Constructor
"; 
         
        ~Apple() //析构函数,在对象消亡时,被自动调用
         
            cout << "Inside Destructor
"; 
         
; 

int main() 
 
    int x = 0; 
    if (x==0) 
     
        static Apple obj; //生命周期为程序结束
     
    cout << "End of main
"; 
 
输出
Inside Constructor
End of main
Inside Destructor

现在,在main结束之后调用析构函数,这是因为静态对象的范围是贯穿程序的生命周期。(程序的最后调用析构函数)

Tips:析构函数

析构函数(destructor)是成员函数的一种,它的名字与类名相同,但前面要加~,没有参数和返回值。一个类有且仅有一个析构函数。如果定义类时没写析构函数,则编译器生成默认析构函数。如果定义了析构函数,则编译器不生成默认析构函数。析构函数在对象消亡时即自动被调用。可以定义析构函数在对象消亡前做善后工作。

类中的静态函数

就像类中的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象。我们被允许使用对象‘.‘来调用静态成员函数,但建议使用类名和范围解析运算符调用静态成员。允许静态成员函数访问静态数据成员或其他静态成员函数,它们无法访问类的非静态数据成员或成员函数。

#include<iostream> 
using namespace std; 

class Apple 
 
    public: 
        // static member function 
        static void printMsg() 
        
            cout<<"Welcome to Apple!"; 
        
; 

// main function 
int main() 
 
    // invoking a static member function 
    Apple::printMsg(); 
    //静态成员函数不依赖于类的对象,可使用类名和范围解析运算符访问它
 

内存的那些事

...态存储区(datasegment):主要存储全局变量(extern),静态变量(static),主要特点是指初始化一次未初始化数据区(bss):主要存 查看详情

const那些事(代码片段)

Const那些事const对象默认为文件局部对象注意:非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显示地指定它为extern。未被const修饰的变量在不同文件的访问//file1.cppintext;//默认为extern//file2.cpp#include<i... 查看详情

异常的那些事(代码片段)

使用traceback获取详细的异常信息try:1/0exceptException,e:printe结果:integerdivisionormodulobyzero只知道是报了这个错,但是却不知道在哪个文件哪个函数哪一行报的错。 下面使用traceback模块importtracebacktry:1/0exceptException,e:traceback.print_exc(... 查看详情

闭包那些事(代码片段)

定义:在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。 例子: 1defmake_adder(addend):2defadder(augend):3returnaugend+addend4returnadder6p=make_adder(23)7q=make_adder(44)89p... 查看详情

xampp那些事(代码片段)

xampp依赖库https://www.microsoft.com/zh-CN/download/details.aspx?id=29下载地址https://www.apachefriends.org/zh_cn/download.htmlxampp数据库配置修改注意事项Composer官网https://getcomposer.org/download/Composer安装注意事项D:xamp 查看详情

关于android性能监控matrix那些事?你知道那些?(完)(代码片段)

关于Android性能监控Matrix那些事?你知道那些?(上)关于Android性能监控Matrix那些事?你知道那些(中)?视频也更新了:微信Matrix卡顿监控实战,函数自动埋点监控方案今天抽空把后面的... 查看详情

定位的那些事

...的类型通过position属性,可以选择四种不同类型的定位:static  relative absolute fixed ;应用于所有元素,无继承性。static:块级元素生成矩形框,行内元素生成行内框,处于正常文档流中。relative:元素相对自身偏移... 查看详情

this指针那些事(代码片段)

this指针那些事引言? 对于Python来说有self,类比到C++中就是this指针用处一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this的作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员时,编译... 查看详情

反射那些事(代码片段)

一直以为只要把类的成员变量设置为private,或者方法设置为private,那么他就对外完全隐藏,类外部无法直接对该成员变量或者方法进行直接访问。但是java的反射,拥有十分强大的功能,它可以访问类中的任意成员变量和方法,... 查看详情

线段树那些事(代码片段)

线段树是学不明白了……部分指针用法对于这段代码,structNodeinta,b,c;YJH[100],x;Node*p=YJH,*q=&x;以下代码在使用过程中是等价的:cout<<x.a<<endl;cout<<q->a<<endl;cout<<(*q).a<<endl;cout<<YJH[2 查看详情

关于网络超时时间那些事(代码片段)

文章目录一、connectTimeout应用层的超时分析内核层的超时分析综合分析二、writeTimeout三、readTimeout四、httpClient中的connectTimeout、socketTimeout、connectionRequestTimeout区别五、一些额外知识点一些资料在实际编程中,我们会经常到超... 查看详情

js属性的那些事(代码片段)

js中一切皆对象,而对象,本质上是一系列属性的集合.对象的属性可分为:命名属性:可直接通过“.”访问到的属性数据属性:专门保存一个值的属性访问器属性:保护数据属性的特殊属性内部属性:不能通过“.”直接访问的属性(比如... 查看详情

elasticsearch有关查询的那些事(代码片段)

ElasticSearch有关查询的那些事上一篇文章介绍了一下ElasticSearch的一些基础的索引,文档的CRUD方法,接下来介绍一些花式查询的操作修改在说查询之前先补充一下之前没讲到的修改功能的内容全量修改现在先重新创建一个... 查看详情

samesite那些事(代码片段)

在《Web安全漏洞之CSRF》中我们了解到,CSRF的本质实际上是利用了Cookie会自动在请求中携带的特性,诱使用户在第三方站点发起请求的行为。除了文中说的一些解决方式之外,标准还专门为Cookie增加了SameSite属性,用来规避该问... 查看详情

关于thisstate的那些事(代码片段)

1.state的定义  状态(state)和属性(props)类似,都是一个组件所需要的一些数据集合,但是它是私有的,并且由组件本身完全控制,可以认为它是组件的“私有属性(或者是局部属性)”。2.thisState的三件事  1.不要... 查看详情

关于android性能监控matrix那些事?你知道那些(中)?(代码片段)

昨天更新了关于Android性能监控Matrix那些事?你知道那些(上)?说的的视频也更新了:微信Matrix卡顿监控实战,函数自动埋点监控方案今天我们接着聊下文:4.Hprof文件分析5.卡顿监控6.卡顿监控源码解析7.插... 查看详情

使用分享hive分区表那些事(代码片段)

一、静态分区1.创建静态分区格式:createtableemployees(namestring,salaryfloat,subordinatedarray<string>,deductionsmap<string,float>,addressstruct<street:string,city:string,state:string,zip:int>)parti 查看详情

二进制那些事(代码片段)

...了计算机的信息只能用二进制数处理。本期将介绍二进制那些事。移位运算移位运算指的是将二进制数值的各数位进行左右移位的运算。左移空出来的低位要进行补0操作,右移空出来的高位要进行怎样的操作,我们会在后面说... 查看详情