const-correctness相关内容

关于 const 成员函数

我遇到了两个关于const成员函数的解释 A 类{上市:...无效 f() 常量 {}...} 这意味着它只能访问常量成员; 表示不修改任何成员; 我认为第二个是正确的.但是为什么第一个出来?有什么需要澄清的吗? 谢谢! 解决方案 你可以在一个 const 成员函数中检查所有的类成员值,在某些情况下你甚至可以改变成员变量的值.第一个解释是不正确的,我不知道它来自哪里.第二 ..
发布时间:2022-01-23 23:46:37 C/C++开发

如何在 const 函数中调用非常量函数 (C++)

我有一个看起来像这样的旧函数: int Random() 常量{返回 var_ ?4:0;} 我需要在该遗留代码中调用一个函数,使其现在看起来像这样: int Random() 常量{返回 var_ ?新呼叫(4):0;} 问题是我收到了这个错误: 在成员函数'virtual int Random() const'中:class.cc:145:错误:将 'const int' 作为 'i ..
发布时间:2022-01-23 23:42:46 C/C++开发

不使用 const_cast 修改 *this 的 const 方法

我正在编写的程序中出现了以下模式.我希望它不是太做作,但它设法在 const 方法 Foo::Questionable() const 中改变一个 Foo 对象,而不使用任何 const_cast 或类似的东西.基本上,Foo 存储对 FooOwner 的引用,反之亦然,在 Questionable() 中,Foo 设法修改通过在其所有者上调用 mutate_foo() 将其自身置于 const ..
发布时间:2022-01-23 23:31:03 C/C++开发

为什么 Python 中没有“const"?

我来自 C 背景,正在学习 Python.缺乏明确的类型安全令人不安,但我已经习惯了.面对动态语言的所有优势,缺乏内置的基于契约的编程(纯抽象类、接口)是需要习惯的. 但是,无法请求 const-cortectness 让我抓狂!为什么 Python 中没有常量?为什么不鼓励类级常量? 解决方案 C和Python分属两种不同的语言. 前者是静态类型的.后者是动态的. 在静 ..
发布时间:2022-01-23 23:19:52 Python

const-correctness 是否给编译器更多的优化空间?

我知道它提高了可读性并减少了程序出错的可能性,但是它对性能的提高有多大? 顺便说一句,引用和 const 指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但如何呢? 解决方案 [编辑:好的,所以这个问题比我一开始想的要微妙.] 声明指向 const 的指针或引用的 const 永远不会帮助任何编译器优化任何东西.(尽管请参阅此答案底部的更新.) const ..
发布时间:2022-01-23 23:08:10 C/C++开发

为什么我不能在 C 中将 'char**' 转换为 'const char* const*'?

以下代码片段(正确)在 C 中给出警告,在 C++ 中给出错误(分别使用 gcc 和 g++,在 3.4.5 和 4.2.1 版本中测试;MSVC 似乎并不关心): char **a;const char** b = a; 我可以理解并接受这一点. 这个问题的 C++ 解决方案是将 b 更改为 const char * const *,这不允许重新分配指针并防止您规避 const-corre ..
发布时间:2022-01-23 23:05:11 其他开发

为什么将“指向非 const 的指针"转换为不合法?指向“指向 const 的指针"

将指向非常量的指针转换为指向常数的指针是合法的. 那么为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么下面的代码是非法的: char *s1 = 0;常量字符 *s2 = s1;//行...字符 *a[MAX];//又名字符 **const char **ps = a;//错误! 解决方案 来自标准: const char c = 'c';字 ..
发布时间:2022-01-23 23:01:12 C/C++开发

cbegin/cend 背后的原因是什么?

我想知道为什么在 C++11 中引入了 cbegin 和 cend ? 在哪些情况下调用这些方法与 begin 和 end 的 const 重载有区别? 解决方案 很简单.假设我有一个向量: std::vector向量; 我用一些数据填充它.然后我想得到一些迭代器.也许让他们四处走动.也许到 std::for_each: std::for_each(vec.begin(), v ..
发布时间:2022-01-10 14:19:54 C/C++开发

声明 C++ 不可变类的惯用方法

所以我有一些非常广泛的功能代码,其中主要数据类型是不可变的结构/类.通过将成员变量和任何方法设为 const,我一直在声明不变性的方式是“实际上不可变的". struct RockSolid {常量浮点数;const 浮动 y;float MakeHarderConcrete() const { return x + y;}} 这真的是 C++ 中“我们应该这样做"的方式吗?或者有更好的方法吗 ..

通过非常量指针修改常量

我对以下代码中发生的事情感到有些困惑: const int e = 2;int* w = ( int* ) &e;//(1) 强制转换以移除常量* w = 5;//(2)cout<<*w<<endl;//(3) 输出 5cout 在(1)中,w指向e的地址.在(2)中,该值更改为 5.但是,当显示 *w 和 e 的值时,它们的值是不同的.但是如果你打印 w 指针和 &e 的值, ..
发布时间:2021-12-13 12:58:30 C/C++开发

const 正确性是否为编译器提供了更多优化空间?

我知道它提高了可读性并使程序不易出错,但它对性能的提高有多大? 顺便提一下,引用和 const 指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但如何? 解决方案 [编辑:好的,所以这个问题比我一开始想的更微妙.] 声明常量指针或常量引用永远不会帮助任何编译器优化任何东西.(尽管请参阅此答案底部的更新.) const 声明仅指示如何在其声明的范围内使用标识 ..
发布时间:2021-12-13 12:57:40 C/C++开发

为什么我不能在 C 中将“char**"转换为“const char* const*"?

以下代码片段(正确地)在 C 中给出警告,在 C++ 中给出错误(分别使用 gcc 和 g++,用 3.4.5 和 4.2.1 版测试;MSVC 似乎并不关心): char **a;const char** b = a; 我能理解并接受这一点. 这个问题的 C++ 解决方案是将 b 更改为 const char * const *,这不允许重新分配指针并防止您规避 const 正确性(C++ ..
发布时间:2021-12-13 12:51:50 其他开发

为什么将“指向非常量的指针的指针"转换为非法?指向“指向常量的指针的指针";

将指向非常量的指针转换为指向常量的指针是合法的. 那为什么将指向非常量指针的指针转换为指向常量的指针的指针是不合法的? 例如,为什么下面的代码是非法的: char *s1 = 0;const char *s2 = s1;//行...字符 *a[MAX];//又名字符 **const char **ps = a;//错误! 解决方案 来自标准: const char c = 'c ..
发布时间:2021-12-13 12:43:34 C/C++开发

将const void *转换为const int *

我之前没有使用过void *和const_correctness,所以我不理解下面的代码在做什么.我想要的只是将由const对象的成员函数返回的void *转换为int *.请提出更好的方法.谢谢. 我收到以下错误 将'const MyClass'作为'void * MyClass :: getArr()'的'this'参数传递 这是我遇到的实际程序 类MyClassImpl {Cv ..
发布时间:2021-04-21 19:44:41 C/C++开发

我应该将局部变量设为const还是可移动?

对于本地作用域中的任何对象,我的默认行为是将其设置为 const .例如: auto const cake = bake_cake(参数); 我会尽量减少非功能性代码,因为这会提高可读性(并为编译器提供一些优化机会).因此,在类型系统中也反映这一点是合乎逻辑的. 但是,使用移动语义会产生问题:如果我的 cake 很难复制或无法复制并且我想在处理完之后将其传递出去怎么办?例如: i ..
发布时间:2021-04-20 18:58:29 C/C++开发

指向常量函数的指针的含义是什么?

可以将指针声明为指向可变(非const)数据或指向常量数据的指针. 可以将指针定义为指向函数. 我和我的同事们正在讨论将"const"与指针一起使用,而关于const与函数指针一起使用的问题浮出水面. 以下是一些问题: 指向常量函数和指针的指针的含义是什么 指向非恒定函数的指针? 函数可以是const吗? 函数可以是非常量(可变)吗? 传递函数指针的正确(安全)语法是什么 ..
发布时间:2020-11-11 19:48:52 其他开发