C++ 中 const和static readonly区别

 更新时间:2020年4月25日 17:32  点击:1791

C++ 中 const和static readonly区别

我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。
在多数情况下可以混用。

二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。

明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:

1. static readonly MyClass myins = new MyClass();
2. static readonly MyClass myins = null;
3. static readonly A = B * 20;
  static readonly B = 10;
4. static readonly int [] constIntArray = new int[] {1, 2, 3};
5. void SomeFunction()
  {
   const int a = 10;
    ...
  }

1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。

因此,对于那些本质上应该是常量,但是却无法使用const来声明的地方,可以使用static readonly。例如C#规范中给出的例子:

public class Color
{
  public static readonly Color Black = new Color(0, 0, 0);
  public static readonly Color White = new Color(255, 255, 255);
  public static readonly Color Red = new Color(255, 0, 0);
  public static readonly Color Green = new Color(0, 255, 0);
  public static readonly Color Blue = new Color(0, 0, 255);

static readonly需要注意的一个问题是,对于一个static readonly的Reference类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。

public static readonly MyClass myins = new MyClass();
…
myins.SomeProperty = 10; //正常
myins = new MyClass();  //出错,该对象是只读的

但是,如果上例中的MyClass不是一个class而是一个struct,那么后面的两个语句就都会出错。  

 private byte red, green, blue;
  public Color(byte r, byte g, byte b)
   {
     red = r;
     green = g;
     blue = b;
   }
}

 在通俗一点说,const类型赋值必须是脱离系统运行时才能初始化的值(const page p=null正确,const page p= new Page()错误,因为 new Page()需要运行时才初始化)可以使用static readonly(static readonly page p= new Page())

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

[!--infotagslink--]

相关文章

  • InterlliJ IDEA2020新建java web项目找不到Static Web的解决

    这篇文章主要介绍了InterlliJ IDEA2020新建java web项目找不到Static Web的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-02
  • C#类中static变量用法分析

    这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下...2020-06-25
  • C++类中的static和const用法实例教程

    这篇文章主要介绍了C++类中的static和const用法,是C++面向对象程序设计中非常重要的概念,需要的朋友可以参考下...2020-04-25
  • 如何在C#9 中使用static匿名函数

    这篇文章主要介绍了如何在C#9中使用static匿名函数,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...2021-03-31
  • Swift中static和class关键字的深入讲解

    这篇文章主要给大家介绍了关于Swift中static和class关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-30
  • C#中const用法详解

    这篇文章主要介绍了C#中const用法,实例分析了C#中const的用法及使用技巧,并对比分析了readonly关键字与const关键字的不同,需要的朋友可以参考下...2020-06-25
  • Java中的static关键字深入理解

    这篇文章主要介绍了Java中的static关键字深入理解,有感兴趣的同学可以研究下...2021-03-01
  • .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法

    当TextBox设置了ReadOnly=true后要是在前台为控件添加了值,后台是取不到的,值为空,多么郁闷的一个问题经过尝试,发现可以通过如下的方式解决这个问题.感兴趣的朋友可以了解下...2021-09-22
  • c#.net中const和readonly的区别

    readonly修饰符用来表示只读,const用来表示不变常量。顾名思义,只读表示不能进行写操作;不变常量不能被修改。这两者到底有什么区别呢...2021-09-22
  • C#中const 和 readonly 修饰符的用法详解

    这篇文章主要介绍了C#中const 和 readonly 修饰符的用法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#中 const 和 readonly 的不同

    const 和 readonly 的区别,总是不太清楚,于是查了查资料。...2020-06-25
  • static全局变量与普通的全局变量的区别详细解析

    以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-04-25
  • 解析C语言中如何正确使用const

    本篇文章是对C语言中如何正确使用const,进行了详细的分析介绍。需要的朋友参考下...2020-04-25
  • C++中四种对象生存期和作用域以及static的用法总结分析

    以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下...2020-04-25
  • C++设计模式之Static Factory模式详解

    这篇文章主要为大家详细介绍了C++设计模式之Static Factory模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • php中global和static两个关键字详解

    php中global和static两个关键字详解,有需要的朋友可参考一下。 1.global在整个页面起作用。 2.static只在function和class内起作用。 global和$GLOBALS使用基本...2016-11-25
  • C++ const关键字分析详解

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性。这篇文章主要介绍了C/C++ 中const关键字的用法,需要的朋友可以参考下...2021-08-29
  • 深入浅析c/c++ 中的static关键字

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。本文重点给大家介绍c/c++ 中的static关键字,感兴趣的朋友跟随小编一起看看吧...2020-04-25
  • ASP.NET中readonly与const的区别详解

    如果你学过ASP.NET理论知识都会知道,在ASP.NET中 readonly和const修饰的变量都是恒量,它们的值是不可以被修改的。但是他们之间到底有什么区别?下面小编就它们的区别用例子来进行说明。...2021-09-22
  • 解析Java中的static关键字

    static是方便在没有创建对象的情况下进行调用(方法/变量)。显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。static可以用来修饰类的成员方法、类的成员变量,另外也可以编写static代码块来优化程序性能...2021-06-14