首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

static修饰的函数有什么特点(static可以修饰所有的变量吗)

static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类: 如果这个静态函数出现在类里,那么它是一个静态成员函数; 静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象...其实很好理解,类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象...如果它不是出现在类中,那么它是一个普通的全局的静态函数。 这样的static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。...而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用。   在函数的返回类型前加上关键字static,函数就被定义成为静态函数。...因此定义静态函数有以下好处:    其他文件中可以定义相同名字的函数,不会发生冲突。    静态函数不能被其他文件所用。

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    编程小知识之 Dispose 模式

    我们需要借助 C# 中的析构函数(或者叫终结器) 这里我们暂时不去关注 C# 中析构函数的各个细节,只要知道析构函数可以在类型被回收之前执行就行了,新的示例代码如下: // dispose pattern...,这也是出于健壮性的考虑), Dispose() 方法中的 GC.SuppressFinalize(this); 便是用来"屏蔽"析构函数的执行的(定义了析构函数的类型可以通过调用 GC.SuppressFinalize...如果是析构函数调用,我们可以释放托管资源吗(标准实现是仅释放非托管资源)?...答案是不可以的,你可以简单理解为在析构函数中不可以引用其他托管资源(其实,实现上来讲,你是可以在析构函数中引用其他托管资源的,只是这些托管资源如果也实现了析构函数(譬如这些托管资源自身实现了 Dispose...模式),那么 CLR 调用这些析构函数的顺序是不定的,这会造成重复释放等问题,再者,如果你引用静态变量来进行托管资源的释放,在 Environment.HasShutdownStarted == true

    1K20

    C++学习————第五天(构造函数 析构函数 拷贝构造函数)

    类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。...一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不可以有参数的 不可以发生重载 4. 对象生命周期结束时,C++编译系统系统自动调用析构函数,而且只调用一次。...7、如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类 typedef int DataType...Time 类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数 注意:创建哪个类的对象则调用该类的析构函数...,销毁那个类的对象则调用该类的析构函数 7、.如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类

    12510

    Envoy源码分析之Dispatcher

    都是通过裸指针的方式进行回调,如果进行回调的时候对象已经析构了,就会出现野指针的问题,我相信C++水平还可以的同学都会看出这个问题,除非能在逻辑上保证Dispatcher的生命周期比所有对象都短,这样就能保证在回调的时候对象肯定不会析构...可能有人会有疑问,对象在析构的时候把注册的事件取消不就可以避免野指针的问题吗? 那如果事件已经触发了,callback正在等待运行呢? 又或者callback运行了一半呢?...前者libevent是可以保证的,在调用event_del的时候可以把处于等待运行的事件取消掉,但是后者就无能为力了,这个时候如果对象析构了,那行为就是未定义了。...沿着这个思路想一想,是不是只要保证对象析构的时候没有callback正在运行就可以解决问题了呢?是的,只要保证所有在执行中的callback执行完了,再做对象析构就可以了。...可以利用Dispatcher是顺序执行所有callback的特点,向Dispatcher中插入一个任务就是用来对象析构的,那么当这个任务执行的时候是可以保证没有其他任何callback在运行。

    1.7K40

    类和对象(2)

    任何类在什么都不写的情况下,会自动生成6个默认成员函数。 构造函数 可以通过Init给对象设置日期,但如果每次创建都用该方法调用日期,未免有一些麻烦。...1 函数名与类名相同 2 无返回值(返回值什么都不需要给,也不需要void) 3 对象实例化时编译器自动调用对应的构造函数 4 构造函数可以重载(同一个类中,可以定义多个构造函数,只要它们的参数列表不同即可...,析构是按照构造的相反顺序进行析构 对象析构要在生存作用域结束的时候才进行析构 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数 将Date类中构造函数放开,代码编译失败...特性 1 析构函数的函数名是在类名之前加上符号~ 2 无参数无返回值(不需要void) 3 一个类只能有一个析构函数,如果没有定义析构函数,则会生成默认的析构函数 4对象生命周期结束时,自动调用析构函数...5 跟构造函数类似,我们不写编译器自动生成的析构函数对内置成员不做处理,自定义成员会调用他的析构函数 6 后定义的先析构(和栈一样,后进先出) 7如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数

    9410

    C++ 初阶 类和对象(中)

    细节: 方法1和方法2不可以同时存在,否则编译器会出现歧义 值得一提的是,方法1和方法2都可以和声明的形式共存,这是因为一旦有了构造函数,编译器就会忽略声明的初始化而去调用构造函数的内容。...有细心的同学可以发现,a也被初始化了,它不应该是随机值吗?...感兴趣的小伙伴可以试一下。 二、析构函数 1.为什么要有析构函数?...讲完了构造函数,那么我们就来讲一下析构函数,既然构造函数是令类创建的时候初始化,那么析构函数则是在类的生命域结束的时候将目标清理,也就是destroy,比方说,我们写了一个顺序表,它malloc了一大块空间...因此在C++中,就诞生了一个函数,它就是析构函数,它能够令对应的类出了它的生命域便销毁,从而保证了安全性。 2.析构函数的特性 1. 析构函数名是在类名前加上字符 ~。 2.

    15210

    【C++】继承

    那上面这三个,我们可以让子类的也打印一下信息,观察一下它们调用的顺序: 我们发现都是一个先父后子的顺序。 4.4 析构函数 那析构函数呢?...按照上面的规律,都是先调用父类的处理父类成员,然后再处理自己的,那我们可以这样写: 但我我们发现这里调不了父类的析构。 那为什么调不了父类的析构呢?...所以这里才不需要我们自己去显式调父类的,而是它自己调,其实就是为了保证这个顺序。 所以对于析构函数: 派生类(子类)的析构函数会在调用完成后自动调用基类(父类)的析构函数清理基类成员。...因为这样才能保证先清理子类成员再清理父类成员的顺序。 派生类对象初始化先调用基类构造再调派生类构造。 派生类对象析构清理先调用派生类析构再调基类的析构。 5....如何实现一个不能被继承的类 那学到这里,大家来思考一个问题,如何去实现一个不能被继承的类? 我们可以将它的构造函数或析构函数设置成私有的。 为什么这样就可以呢?

    14610

    如何快速掌握一门新技术,有什么独特的学习方法和技巧可以分享吗?

    今日话题:如何快速掌握一门新技术,有什么独特的学习方法和技巧可以分享吗?图片这个话题引起了我的思考和总结,现在的技术这么多,我们该如何高效的学习呢?我先总结一下我所了解的技术和学习的路径。...,有很多也用不上了。...针对这么多的技术,我也总结了我学习过程中的技巧。快速学习技巧学习目标的确立在学习一门新技术之前,可以先确定自己学习的目标,为什么要去学,要学到什么程度。如为了更高的薪资、为了学习技术。...可以跟着视频教程做项目,也可以根据实际的问题开发出对应的代码。如:shigen上次就使用python开发了一个在控制台阅读Excel文件内容的工具。...不断的分享新技术新体验新技巧,主打一个与shigen一起,每天不一样!以上就是shigen对于如何快速掌握一门新技术,你有什么独特的学习方法和技巧可以分享吗?的经验总结和分享了。

    26620

    【c++】类和对象(三)构造函数和析构函数

    构造函数可以有参数,也可以没有参数,允许通过不同的方式初始化对象的成员变量。...Time类的对象,为什么最后会调用Time类的析构函数?...,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数,目的是在其内部调用Time类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用...Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数...,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类 3.2析构函数的调用顺序 class Date { public: Date(int year=1) { _year

    16110

    类与对象(中(1))

    类的6个默认成员函数 首先我们先总体来了解一下默认成员函数有哪些,下面我为大家带来一张总览图: 如果一个类中什么成员都没有,简称为空类。 class xxx {}; 那么空类中真的什么都没有吗?...Init公有方法来给特定对象初始化日期,但如果每次都手动进行添加,容错率就比较高了,那么我们有没有什么更好的办法来初始化日期呢?...析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。...特性 析构函数也是特殊的成员函数: 1. 析构函数名是在类名前加上字符 ~。 2. 无参数无返回值类型。 3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。...如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

    7110

    c++类和继承面试点25连问

    析构函数是否可以为虚函数?如果可以,有什么作用? 析构函数可以是虚函数,因为它是对象结束时才调用,不影响虚表构建。...那么析构函数作为虚函数有什么作用呢,看这样一段代码: #include using namespace std; class A { public: A() {...所以当类有派生类时,析构函数一定要是虚函数。 8....析构函数是否可以抛异常 可以,但是最好不要抛出,如果一定要抛出,那要在析构函数内部处理,保证析构函数能执行完成。 16....22. new一个类的时候发生了什么 new其实就是申请动态内存,而一个类只有虚指针和成员变量才需要内存,所以new一个类就是给虚指针和成员变量申请内存空间。 23. 类的成员函数有地址吗?

    99410

    每日一问06 构造函数可以是虚函数吗

    技术分类:开发语言 前置知识:虚函数工作原理 推荐阅读 :[侯捷]C++内存管理--从平地到万丈高楼 https://www.bilibili.com/video/BV1Kb411B7N8 思路 构造函数可以是虚函数吗...是有构造函数特点决定的 虚函数使用条件必须是通过指针或者引用调用 构造函数无法通过指针直接调用。只能通过 placement new方式调用。...根本说不清楚:必须创建好了,才能用,不懂 抽象和具体关系.接口不属于具体一个类 析构函数可以是虚函数吗,为什么 参考思路: 可以是 析构函数 执行顺序是 派生类 ,基类 如果析构函数不被声明成虚函数,则编译器实施静态绑定...,在删除指向派生类的基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。...如果声明了,触发 派生类 ,基类 正确析构顺序。

    70930

    C++面试题

    而析构函数同样也是成员函数,虚析构函数也会进入虚表,唯一不同的是,函数名并不要求一致,而且,你如果不写,编译器也会帮你生成,而且如果基类有virtual,编译器也会默认给子类添加。...但是不论如何它依旧遵守多态的规则,也就是说,如果你的析构函数是虚函数,调用虚函数的规则也遵守多态原则,也就是会调用子类的析构函数,这和其他虚函数的机制完全一致,并没有什么不同。...而子类析构函数具有析构掉基类的职责,所以不会造成内存泄漏。而基类并不知道自己的子类。 4. 构造函数和析构函数能抛出异常吗? 不能。 5. 多继承存在什么问题?如何消除多继承中的二义性?...C++的空类有哪些成员函数 默认构造函数、 默认拷贝构造函数、 默认析构函数、 默认赋值运算符,以及取址运算符和 const 取址运算符。 10. 虚函数表属于类还是对象?虚函数表什么内存空间?...因此,将析构函数设为私有,类对象就无法建立在栈上了。 7. 浅拷贝和深拷贝有什么区别? 8. 字节对齐的原则是什么?

    1.7K42

    C++:继承与派生

    4、派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能 保证派生类对象先清理派生类成员再清理基类成员的顺序。 5....,会自定调用父类析构函数,保证先析构子再析构父 protected: int _num; //学号 }; 思考: 1、既然我们知道了怎么显式写,但是真的有必要吗??...那么编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加virtual的情况下,子类析构函数和父类析构函数构成隐藏关系。...2、子类和父类的构造和析构顺序是怎么样的? 五、继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员 解决方案就是在学生类里也搞个友元。...(将析构函数设成私有也可以) 但是你可能会想,把构造函数放在私域,那A不是也创建不了对象了吗???确实是这样的! 但是也有一个解决的方法,就是利用静态成员函数去返回这个构造函数。

    18610

    【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作

    对于空类,并不是什么都没有,编译器会自动默认生成以下六个默认成员函数 二、构造函数 2.1 构造函数概念 构造函数是特殊的成员函数,其中函数名与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值...,但是打了补丁,即是:内置类型成员变量在类中声明事可以给缺省值 *** 三、析构函数 3.1 析构函数概念 析构函数与构造函数功能相反,该函数任务并不是完成对象本身销毁(局部对象的销毁时由编译器完成),...自定义类型成员,调用对应的析构函数 3.3 析构函数处理顺序 关于析构函数顺序涉及到函数栈帧,不知道你们是否注意到上面打印顺序跟栈特性是相关的。...如果类外面不能随便访问成员,有什么办法可以解决呢?...非const对象可以调用const成员函数吗? const成员函数内可以调用其他的非const成员函数吗? 非const成员函数内可以调用其他的const成员函数吗?

    12100

    C++从入门到精通——类的6个默认成员函数之析构函数

    析构函数 前言 一、析构函数的概念 二、析构函数的特性 三、析构函数的练习题 四、总结 前言 类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?...Time类的对象,为什么最后会调用Time类的析构函数?...Time 类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数 注意:创建哪个类的对象则调用该类的析构函数...,销毁那个类的对象则调用该类的析构函数 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。...三、析构函数的练习题 两个栈实现一个队列 四、总结 有资源需要显示清理,就需要写析构函数。如Stack List 没有资源需要清理,如Date (日期类),内置类型成员没有资源需要清理。

    40721
    领券