Skip to content

const

如何在const成员函数中赋值?

使用mutable去掉const的成员函数的const性质

为什么要有这种去除常量标志的需求?

  • 两个概念:物理常量性和逻辑常量性
    • 物理常量性:实际上就是常量。
    • 逻辑常量性:对用户而言是常量,但在用户不能访问的细节上不是常量。

const_cast和mutable的比较

  • const_cast:
    • 强制去掉对象的const属性。
    • 缺点:对const对象,调用包含const_cast的const成员函数,属于未定义行为。
  • mutable:
    • 使用场景:对可能要发生变化的成员前,加上存储描述符mutable。
    • 实质:对加了mutable的成员,无视所有const声明。

const 与 #define 的比较,const有什么优点?

  • const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。
  • 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

const、static 关键字有什么区别

conststatic都是用于声明变量时的修饰符,它们都能被用来修饰一个变量的作用域、生命周期和内存分配方式。但是,它们之间还是有一些区别的:

  • const用于声明一个变量时,它表示这个变量的值不能被修改。也就是说,如果一个变量被声明为const,它的值在程序执行过程中是固定的,不能被修改。

    cpp
    const int x = 5;  // 声明一个名为x,值为5的常量
  • static用于声明一个变量时,它表示这个变量的作用域为整个程序,而不是局限于特定的函数或块。如果一个变量被声明为static,它在程序开始执行时会分配内存,并在程序结束时释放内存。此外,如果一个static变量在多个函数中被访问,那么它的值只会被初始化一次。

    cpp
    static int x = 5;  // 声明一个名为x,值为5的静态变量

综上,conststatic都是用来声明变量的修饰符,但它们之间的区别在于:const用来保证变量值不能被修改,而static用来保证变量的作用域和生命周期。

如何初始化const和static数据成员?

通常在类外初始化static数据成员,但是 static const 的整型(ool,char,int,long)可以再类声明中初始化, static const的其他类型也必须在类外初始化(包括整型的数组)。

static const 和 const static 有什么区别

static constconst static在C++中没有区别。这两种表达方式都表明了一个变量是静态的(只初始化一次)且是常量(只读的,不能被修改)。

在C++中,修饰符(例如staticconst)的顺序不影响其含义。因此,无论你是用static const还是const static,都表示相同的意思。

但是,通常const会被放在类型前面,例如const int,因此static const更常见。这也是推荐的书写方法,因为它与const本身被放在类型前面的一般惯用法相一致。

吃好喝好 快乐地活下去