gpt4 book ai didi

c++ - 理解常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:09:13 25 4
gpt4 key购买 nike

如果你想写一个迭代器,你通常这样写<​​/p>

T* operator->() const;

我的问题是用指针和引用来理解这个“常量”。

例如,您可以编写以下结构:

struct A{
int* x;

A(int& x0):x{&x0}{}
int* ptr() const {return x;}
int& ref() const {return *x;}
};

你可以这样使用它:

int x = 10;
const A a{x};

int& r = a.ref();
int* p = a.ptr();

*p = 4;
cout << x << endl; // prints 4

r = 25;
cout << x << endl; // prints 25

但为什么它可以编译并正常工作(至少对于 g++ 和 clang 是这样)。为什么?

我定义的

const A a{x};

这个“a”是常量。所以当我调用

int* p = a.ptr();

我正在用一个 const 对象调用 ptr(),所以内部指针 A->x 必须是“int * const”。但我返回的是一个没有 const 的“int *”。为什么这是正确的?

引用会发生什么?如果我用“const A”调用 A::ref(),这个函数返回的类型是什么?像“int& const”之类的东西??? <--- 我想这与“int&”相同。

感谢您的帮助。

最佳答案

按位常量和逻辑常量是有区别的。

当你有一个 const A 时,你不能修改它的 int* 成员。但是修改成员本身(x 指向的 which int)和通过成员修改( 的值>int x 指向)。这些是不同类型的 const。在最简单的情况下:

struct Ptr { int* p; };

int i = 42;
const Ptr ptr{&i};
*ptr.p = 57;

ptr.p 仍然指向 i,那里没有任何改变,所以 const 机制被强制执行。但它在逻辑上不是 const,因为您仍然通过 const 对象更改了某些内容。但是,该语言不会为您强制执行。这取决于您作为库编写者。

如果你想传播 const-ness,你只需提供一个逻辑上const的接口(interface):

int const* ptr() const {return x;}
int const& ref() const {return *x;}
// ^^^^^

现在,用户无法通过您的 const A 按位(无法更改 x 指向的内容)和逻辑方式(无法更改的值)进行修改那个受教育者)。

关于c++ - 理解常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com