带有 const 指针参数的 C++ 函数

问题描述 投票:0回答:1

我现在正在编程课上学习链表。以下代码是编译并运行的:

struct Node {
    int data;    
    Node *link;
   };

// this function compiles and works
size_t list_length(const Node* head_ptr) {
    size_t size{};
    for ( ; head_ptr != nullptr; head_ptr = head_ptr->link) {
        size++;    
    }
    return size;
}

list_length 函数的以下实现无法编译:

// this function gives a compile times error
size_t list_length(const Node* head_ptr) {
    size_t size{};
    Node *ptr = head_ptr;
    for ( ; ptr != nullptr; ptr = ptr->link) {
        size++;    
    }
    return size;
}

我对 const 限定符感到困惑。在这种情况下,我知道这意味着参数不能在函数内更改。我有两个问题:

  1. 在list_length有效的版本中,如果head_ptr是一个const变量,为什么for循环可以改变head_ptr的值?随着循环的迭代,head_ptr的值不是在改变吗?

  2. 在无法编译的list_length版本中,为什么不能将head_ptr的值赋给新的指针变量?

c++ pointers constants
1个回答
0
投票

在第二种情况下,您尝试从

const
指针创建非
const
指针。编译器不会允许这样做,因为它可能会在其他地方引起问题。您可以使用
const
指针进行复制,或使用
const_cast
绕过错误检查。所以要么:

const Node *ptr = head_ptr; // make ptr const to match the source item

Node *ptr = const_cast<Node*>(head_ptr); // cast away the const

在此处的情况 2 中,编译器允许进行强制转换,因为您告诉它您知道自己在做什么。

© www.soinside.com 2019 - 2024. All rights reserved.