【问题标题】:The difference between returning by reference and a pointer in a const functionconst 函数中按引用返回和指针返回的区别
【发布时间】:2020-06-07 07:49:06
【问题描述】:

我正在研究一些 C++ 代码,我想知道为什么这段代码无法编译:

class A {
    int K;
    const int* f(const int* k) const {
        return *k;
    }
};

并且这段代码确实可以编译:

class A {
    int K;
    const int* f(const int* k) const {
        return &K;
    }
};

我不明白有什么区别,因为我也试图在第一个返回 const

&K 是地址吗?

【问题讨论】:

  • *k 的类型为 const int,但您的函数声称返回 const int*。您无法将 const int 转换为 const int*。一个是指针,另一个不是。这是故意的还是问题中的错字?
  • 首先:您在两个示例中使用了 2 个不同的“k”
  • @Berto99 这是有意的
  • @walnut,你能告诉我&K的类型是什么吗? (大写)&K 类型是否为 const int *?如果是,您能解释一下原因吗?
  • @razlevy &K 的类型为 const int*。我不清楚你的问题是什么。该错误与const 无关。您得到的错误是因为指针和非指针不能隐式地相互转换。这里也没有“returning by ref”。

标签: c++ class constants


【解决方案1】:

指针可以保存对象的内存地址。现在,由于您的函数const int* f(const int* k) const 返回指向intconst 指针,这意味着您必须返回指向intconst 指针或int 的内存地址。

在您的第一个代码中,您取消引用指针并将其返回给函数,这意味着您正在返回一个值。这不适用于上述论点。

但是,您的第二个代码会编译,因为您将对象的地址返回到 f(在您的情况下是整数 int K 的内存地址)。

【讨论】:

    【解决方案2】:

    在第一种情况下,您要取消引用 const int* k 指针,这意味着您正在尝试返回 int 值,而函数 const int* f(const int* k) const 期望返回指针 const int*

    在第二种情况下,您使用 & 它返回您的 int K 类成员的地址,并且因为 const int* f(const int* k) const 函数期望返回类型将是指向 const int* 的指针,它确实可以毫无问题地编译。

    【讨论】:

      【解决方案3】:

      您可能对这里的语法感到困惑。尽管看起来,运算符* 返回一个引用,而运算符& 返回一个指针。例如:

      int k0 = 0;    // declare a regular int variable
      int* k1 = &k0; // declare a pointer to int and assign the address of k0 to it
      int& k2 = *k1; // declare a reference to int and make it refer to the value pointed by k1
      

      如您所见,&* 的含义在用于表达式而不是在类型声明中时有点互换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        • 2018-08-19
        相关资源
        最近更新 更多