首页 > 其他分享 >.static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。

.static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。

时间:2023-06-05 22:03:54浏览次数:34  
标签:初始化 const 函数 静态 成员 static 修饰

static的作用:

对变量:

1.局部变量:

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

  1)内存中的位置:静态存储区

  2)初始化:局部的静态变量只能被初始化一次,且C中不可以用变量对其初始化,而C++可以用变量对其初始化。

  3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置(从原来的栈中存放改为静态存储区)及其生命周期(局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问),但未改变其作用域。

2.全局变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

注:static修饰全局变量,并未改变其存储位置及生命周期,而是改变了其作用域,使当前文件外的源文件无法访问该变量,好处如下:(1)不会被其他文件所访问,修改(2)其他文件中可以使用相同名字的变量,不会发生冲突。对全局函数也是有隐藏作用。而普通全局变量只要定义了,任何地方都能使用,使用前需要声明所有的.c文件,只能定义一次普通全局变量,但是可以声明多次(外部链接)。注意:全局变量的作用域是全局范围,但是在某个文件中使用时,必须先声明。

对类中的:

    1.成员变量

    用static修饰类的数据成员实际使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象。因此,static成员必须在类外进行初始化(初始化格式: int base::var=10;),而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化 。

    特点:

  1. 不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。 
  2. 静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。
  3. 静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的指针或引用。

2.成员函数

  1. 用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针。
  2. 静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。base::func(5,3);当static成员函数在类外定义时不需要加static修饰符。
  3. 在静态成员函数的实现中不能直接引用类中声明的非静态成员,可以引用类中说明的静态成员。因为静态成员函数不含this指针。 

不可以同时用const和static修饰成员函数。

C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。

我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

const的作用:

 1.限定变量为不可修改。

2.限定成员函数不可以修改任何数据成员。

3.const与指针:

const char *p 表示 指向的内容不能通过p改变,但是p还可以指向其他对象。

char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。



标签:初始化,const,函数,静态,成员,static,修饰
From: https://blog.51cto.com/u_4018548/6419781

相关文章

  • Java中为什么禁止把SimpleDateFormat定位为static变量以及如果非要使用static定位Simp
    场景Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/art......
  • const { t } = useI18n();不能在setup外执行
    传递函数constchartOptions=(t:Function,color:string="warning",height:string="auto"):ApexOptions=>{return{//Restofyourchartoptionscategories:[t("Totalnumber"),t("normal"),&......
  • 事件绑定-事件修饰符
    事件修饰符在事件处理函数中调用event.preventDefault()或event.stopPropagation()是非常常见的需求。因此,vue提供了事件修饰符的概念,来辅助程序员更方便的对事件的触发进行控制。常用的5个事件修饰符如下:事件修饰符说明.prevent阻止默认行为(例如:阻止a连接的跳转、阻......
  • 类型转换static_cast<type>(value)
    来自CHATGPT的回答  static_cast<float>(value)和(float)value实际上是完成相同的类型转换,即将value的类型转换为float类型。两者的区别在于语法和一些特定的使用情境。语法:static_cast<float>(value)是使用C++中的static_cast运算符进行类型转换的方式,而(fl......
  • Js中var,let,const的区别总结
    目录区别var关键字let关键字const关键字区分var和let声明变量(作用域区别)var声明let声明因为let和const是es6的新特性,let和const的出现就是为了解决var的各种问题,因此在声明变量时能不用var就不用,强烈建议都用let和const声明变量和常量!区别1、var声明的变......
  • 使用vue出现Uncaught TypeError: Vue is not a constructor错误
    原因是vue2和vue3写法不对正确是<!DOCTYPEhtml><html>   <head>      <metacharset="utf-8">      <title></title>      <scripttype="text/javascript"src="https://unpkg.com/vue@next"></s......
  • 运算符重载&const修饰符
    运算符重载运算符重载一般作为类的成员函数实现,用于实现自定义类的运算操作。[返回值]operator[运算符](参数...){...};参数参数个数必须与运算符原意需要的参数相同,比如重载+,就需要两个参数(左参数和右参数)对于单目运算符,不需要传入参数,以为已经默认将成员this指针指向的......
  • 无法删除索引 1553 - Cannot drop index ‘fk_pptn_r_emtc‘: needed in a foreign ke
    标题标题:解决问题:1553-无法删除索引‘fk_pptn_r_emtc’:外键约束需要引言:在数据库管理中,经常会遇到各种问题和错误。其中之一是"1553-无法删除索引‘fk_pptn_r_emtc’:外键约束需要"错误。这个错误可能会导致数据库操作受阻,影响系统的正常运行。在本篇博客中,我们将深入探讨这......
  • android基础-ConstraintLayout
    资料约束布局ConstraintLayout看这一篇就够了ConstraintLayout布局居中|居右实现。ConstraintLayout中TextView文字超过屏幕问题ConstraintLayoutConstraintLayout字体超出屏幕解决方法约束布局ConstraintLayout看这一篇就够了具体的方法layout_constraintLeft_toLeftOflayout_c......
  • 5.15 static 应用案例
    classBook{privateStringtitle;privatestaticintcount=0;publicBook(){//无参构造this("NOTITLE-"+count++);//避免了没有title的情况,调用下面的构造方法,把“NOTITLE-count”当作title}publicBook(Stringtitle){......