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 关键字有什么区别
const
和static
都是用于声明变量时的修饰符,它们都能被用来修饰一个变量的作用域、生命周期和内存分配方式。但是,它们之间还是有一些区别的:
const
用于声明一个变量时,它表示这个变量的值不能被修改。也就是说,如果一个变量被声明为const
,它的值在程序执行过程中是固定的,不能被修改。cppconst int x = 5; // 声明一个名为x,值为5的常量
static
用于声明一个变量时,它表示这个变量的作用域为整个程序,而不是局限于特定的函数或块。如果一个变量被声明为static
,它在程序开始执行时会分配内存,并在程序结束时释放内存。此外,如果一个static
变量在多个函数中被访问,那么它的值只会被初始化一次。cppstatic int x = 5; // 声明一个名为x,值为5的静态变量
综上,const
和static
都是用来声明变量的修饰符,但它们之间的区别在于:const
用来保证变量值不能被修改,而static
用来保证变量的作用域和生命周期。
如何初始化const和static数据成员?
通常在类外初始化static数据成员,但是 static const 的整型(ool,char,int,long)可以再类声明中初始化, static const的其他类型也必须在类外初始化(包括整型的数组)。
static const 和 const static 有什么区别
static const
和const static
在C++中没有区别。这两种表达方式都表明了一个变量是静态的(只初始化一次)且是常量(只读的,不能被修改)。
在C++中,修饰符(例如static
和const
)的顺序不影响其含义。因此,无论你是用static const
还是const static
,都表示相同的意思。
但是,通常const
会被放在类型前面,例如const int
,因此static const
更常见。这也是推荐的书写方法,因为它与const
本身被放在类型前面的一般惯用法相一致。