C++关键字const的作用

const作用(一旦被修饰,被修饰的量不能更新)
1、修饰变量,说明该变量不可以被改变;
2、修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
常量指针 const int *p;指向的内存空间可以改,不能修改指向内存的值
指针常量 int *const p;指向的内存空间不能改,值可以改
既修饰指针又修饰常量
const int * const p;
3、修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
4、修饰成员函数,说明该成员函数内不能修改成员变量。

使用情况
1、修饰一般常量
2、修饰常数组
3.修饰常对象:定义常对象时,要进行初始化,且该对象不能再被更新
4、修饰常指针
5、修饰常引用
5、修饰函数常参数:防止被修改

常引用
1、作用变量的只读属性的别名,通过这个别名只能获得变量的值,但不能改变
2、用于函数的形参,保证在函数呢不糊改变实参的值

// 类
class A
{
private:
    const int a;                // 常对象成员,只能在初始化列表赋值

public:
    // 构造函数
    A() : a(0) { };
    A(int x) : a(x) { };        // 初始化列表

    // const可用于对重载函数的区分
    int getValue();             // 普通成员函数
    int getValue() const;       // 常成员函数,不得修改类中的任何数据成员的值
};

void function()
{
    // 对象
    A b;                        // 普通对象,可以调用全部成员函数、更新常成员变量
    const A a;                  // 常对象,只能调用常成员函数
    const A *p = &a;            // 指针变量,指向常对象
    const A &q = a;             // 指向常对象的引用

    // 指针
    char greeting[] = "Hello";
    char* p1 = greeting;                // 指针变量,指向字符数组变量
    const char* p2 = greeting;          // 指针变量,指向字符数组常量(const 后面是 char,说明指向的字符(char)不可改变)
    char* const p3 = greeting;          // 自身是常量的指针,指向字符数组变量(const 后面是 p3,说明 p3 指针自身不可改变)
    const char* const p4 = greeting;    // 自身是常量的指针,指向字符数组常量
}

// 函数
void function1(const int Var);           // 传递过来的参数在函数内不可变
void function2(const char* Var);         // 参数指针所指内容为常量
void function3(char* const Var);         // 参数指针为常量
void function4(const int& Var);          // 引用参数在函数内为常量

// 函数返回值
const int function5();      // 返回一个常数
const int* function6();     // 返回一个指向常量的指针变量,使用:const int *p = function6();
int* const function7();     // 返回一个指向变量的常指针,使用:int* const p = function7();

volatile
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。
在多线程编程时可能会遇到变量的值因为其他进程改变了。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 C++ const_cast 是一种用于转换 const 或 volatile 类型的指针或引用的关键字。它可以去掉指针或引用类型的常量性或易变性,但是需要注意,这种转换可能会导致未定义的行为。 下面是一个使用 const_cast 的简单示例: ```c++ void func(const int* ptr) { int* writable = const_cast<int*>(ptr); *writable = 100; // 通过 writable 修改指向的值 } int main() { int num = 10; const int* ptr = &num; func(ptr); // 调用 func 函数,修改 num 的值 return 0; } ``` 这个例子,我们定义了一个 const int 类型的指针 ptr,它指向变量 num。在 func 函数,我们使用 const_cast 去除了 ptr 指针的常量性,并将其赋值给了 int* 类型的 writable 指针。然后,我们通过 writable 指针修改了 num 的值。 需要注意的是,使用 const_cast 进行类型转换时需要非常小心,因为它可能会破坏原本的常量性或易变性,导致未定义的行为。因此,应该尽可能避免使用 const_cast,除非确实需要修改 const 或 volatile 对象。 ### 回答2: const_cast是C++的一个关键字,用于将const属性从一个指针或引用移除。它可以显式地将常量指针或引用转换为非常量指针或引用。 const_cast的使用场景可以分为两种情况。第一种情况是当我们需要修改一个以const声明的非指针或引用类型的变量时,使用const_cast可以去除其const属性。例如,当我们传递一个常量引用给一个函数,而这个函数需要修改该变量的值时,我们可以使用const_cast将其转为非常量引用,从而实现对变量的修改。 另一种情况是当我们需要修改一个以const声明的指针或引用类型的变量所指向的内容时,使用const_cast也可以实现。这通常发生在一个函数接受非常量指针或引用类型的参数,但在内部需要对参数所指向的内容进行修改时。在这种情况下,使用const_cast将常量指针或引用转换为非常量的形式,然后对其所指向的内容进行修改,可以达到我们的目的。 需要注意的是,虽然const_cast可以改变指针或引用的常量属性,但其本质上并不会真正去除对象的常量性。通过const_cast的修改操作可能会引发未定义行为或安全问题,因此使用const_cast时应当非常谨慎。我们应当遵循C++的常量性规则,并确保对常量对象的操作不会导致不可预期的结果。 总之,const_cast是C++的一个关键字,它的主要作用是用于将const属性从指针或引用移除,从而实现对常量对象的修改。但使用const_cast需要谨慎,遵循C++常量性规则,以确保程序的正确性和安全性。 ### 回答3: 关键字const_cast是C++的一个强制类型转换符号,用于去除指针或引用变量的const或volatile属性。 在C++const修饰的变量表示其值是不可修改的,而volatile修饰的变量表示该变量可能会在任何时间被修改或读取,不受编译器对该变量的优化。 const_cast用于改变指针或引用的常量或易变性属性,使其能够修改被const修饰的变量。 const_cast的使用方式如下: 1. 将指针或引用从const转换为非constconst_cast<T*>(ptr)。其T为指针所指向的类型,ptr为被const修饰的指针。 2. 将指针或引用从volatile转换为非volatile:const_cast<T volatile*>(ptr)。其T为指针所指向的类型,ptr为被volatile修饰的指针。 需要注意的是,const_cast只能用于去除指针或引用变量的常量属性,而不能改变实际的变量本身,否则会导致未定义的行为。另外,使用const_cast去除const或volatile属性应该是谨慎的行为,只有在确保被修改的变量实际上不会被修改的情况下才能使用。 综上所述,const_cast关键字C++用于去除指针或引用变量的const或volatile属性,使其能够修改被const修饰的变量。但需要注意使用时的谨慎和合理性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值