取消引用指向常量的指针

Ash*_*him 21 c++

假设我们有一个叫做object的类.

int main(){
    object a;
    const object* b = &a;
    (*b); 
}
Run Code Online (Sandbox Code Playgroud)

问题:b是指向const的指针,但它指向的对象实际上不是常量对象.我的问题是,当我们取消引用指针"b"时,为什么我们得到一个常量对象而不是它实际指向哪个是正常的非常量对象.

AnT*_*AnT 23

因为这就是内置的解引用操作符*在C++中的工作方式.如果取消引用类型的指针T *,则会得到一个类型的左值T.在你的情况下Tconst object.

既不是*运算符,也不是指针本身关心(或知道)指针指向的对象实际上是非常量的.它在C++语言使用的静态类型概念中不可能是任何其他方式.

在第一个(和更深层次)间接层的const限定的整个目的是为您提供创建对象的限制性访问路径的能力.即通过创建指向const的指针,即使指针对象不是常量,你也故意并且自愿地阻止自己(或其他人)修改指针.

  • 并不是的.声明一个指针`const`简单地告诉编译器:"不要让这个指针的用户改变它指向的对象".它没有说明对象本身. (2认同)

Bar*_*mar 12

表达式的类型只是基于表达式中变量的声明类型,它不能依赖于动态运行时数据.例如,你可以写:

object a1;
const object a2;
const object *b;
if (rand() % 2 == 0) {
    b = &a1;
} else {
    b = &a2;
}
(*b);
Run Code Online (Sandbox Code Playgroud)

类型*b是在编译时确定的,它不能取决于rand()运行程序时返回的内容.

既然b被宣布指向const object,那就是那种类型*b.


Cia*_*Pan 6

因为const关键字的意思是"你不能修改那个对象",而不是"不能修改对象".

当您将对象传递给某个函数以仅使用对象的值但是但不能修改它时,这很有用:

// We expect PrintMyString to read the string
// and use its contents but not to modify it

void PrintMyString(const char *string);

void myfunction(int number)
{
    // build and print a string of stars with given length
    if(number>0 && number<=16]
    {
        char string[17];
        int i;
        for(i=0, i<number; i++)
            string[i] = '*';
        string[number] = '\0';

        PrintMyString(string);
    }
}
Run Code Online (Sandbox Code Playgroud)

该函数PrintMyString将获得一个字符数组,但该数组将作为"只读"传递给该函数.数组在拥有函数中肯定是可修改的,但PrintMyString只能读取它得到的内容而不能改变内容.