我想知道为什么cbegin并cend在C++ 11中引入?
什么情况下使用这些方法时,使得从常量重载的差异begin和end?
那么为什么总是建议尽可能经常使用const呢?在我看来,使用const可能比C++中的帮助更痛苦.但话说回来,我是从python的角度来看这个:如果你不想改变某些东西,不要改变它.所以说,这里有几个问题:
似乎每次我将某些东西标记为const时,我都会收到错误,并且必须将某些其他函数更改为const.然后这导致我必须在其他地方更改另一个功能.这是通过经验变得更容易吗?
使用const的好处真的足以弥补麻烦吗?如果您不打算更改对象,为什么不编写不会更改它的代码?
我应该注意到,在这个时间点,我最关注的是使用const来实现正确性和可维护性的好处,尽管了解性能影响也很好.
const-correctness的要点是能够提供用户无法更改或删除的实例的视图.编译器支持这一点,指出何时从const函数中断开constness,或者尝试使用const对象的非const函数.因此,如果不复制const方法,我可以在C#中使用具有相同目的的方法吗?
我知道不变性,但这并不能真正地将容器对象转移到一个例子.
我已多次阅读过,在C或C++代码中强制执行const-correctness不仅是一个关于可维护性的好习惯,而且它可能允许编译器执行优化.但是,我也完全相反 - 它根本不会影响性能.
因此,您是否有一些示例,其中const正确性可以帮助您的编译器提高程序的性能?
我知道它提高了可读性并使程序不易出错,但它提高了多少性能?
在旁注中,参考和const指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但是如何呢?
以下代码片段(正确)在C中发出警告,在C++中发出错误(分别使用gcc和g ++,使用版本3.4.5和4.2.1进行测试; MSVC似乎并不关心):
char **a;
const char** b = a;
Run Code Online (Sandbox Code Playgroud)
我能理解并接受这个.
这个问题的C++解决方案是将b更改为const char*const*,它不允许重新分配指针并阻止你绕过const-correctness(C++ FAQ).
char **a;
const char* const* b = a;
Run Code Online (Sandbox Code Playgroud)
但是,在纯C中,更正后的版本(使用const char*const*)仍会发出警告,我不明白为什么.有没有办法绕过这个而不使用演员?
澄清:
1)为什么这会在C中产生警告?它应该完全是const安全的,并且C++编译器似乎认识到它.
2)在说(并让编译器强制执行)我不会修改它指向的字符时,接受这个char**作为参数的正确方法是什么?例如,如果我想写一个函数:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
Run Code Online (Sandbox Code Playgroud)
我想在char**上调用它,参数的正确类型是什么?
编辑:感谢那些做出回应的人,特别是那些提出问题和/或跟进我的回复的人.
我已经接受了这样一个答案,即如果没有演员阵容,我想做的事情是无法完成的,无论是否应该这样做.
我正在为嵌入式系统编写软件.
我们使用指针访问FPGA器件的寄存器.
一些寄存器是只读的,而另一些寄存器是只写的.
只读寄存器在读取时将产生未定义的值.
我想定义一个指针类型,允许编译器检测何时从只写寄存器(也称为解除引用)读取值.
只使用C语言语法创建只写指针吗?
(我们正在使用C开发第一个原型,但是在第二代转向C++.)
如何在C++中创建高效的只写指针?(请记住,这不是跟踪动态内存中的项目,而是访问硬件地址.)
此代码用于安全性和质量最受关注的嵌入式系统.
我知道答案是99.99%没有,但我认为值得一试,你永远不会知道.
void SomeFunction(int a)
{
// Here some processing happens on a, for example:
a *= 50;
a %= 10;
if(example())
a = 0;
// From this point on I want to make "a" const; I don't want to allow
// any code past this comment to modify it in any way.
}
Run Code Online (Sandbox Code Playgroud)
我可以做一些类似的东西const int b = a;,但它并不是真的相同,它会造成很多混乱.只接受C++ 0x解决方案.
编辑:另一个不那么抽象的例子,那个让我问这个问题的例子:
void OpenFile(string path)
{
boost::to_lower(path);
// I want path to be constant now
ifstream ...
}
Run Code Online (Sandbox Code Playgroud)
编辑 …
免责声明:我知道有两个关于const-correctness有用的问题,但是,没有人讨论过如何在C++中使用const-correctness 而不是其他编程语言.此外,我对这些问题的答案不满意.
我现在使用了一些编程语言,在C++中让我烦恼的一件事就是const-correctness的概念.在Java,C#,Python,Ruby,Visual Basic等中没有这样的概念,这似乎对C++非常具体.
在你推荐我使用C++ FAQ Lite之前,我已经阅读了它,但这并不能说服我.完全有效,可靠的程序一直用Python编写,没有const关键字或等价物.在Java和C#中,对象可以声明为final(或const),但是没有const成员函数或const函数参数.如果函数不需要修改对象,则它可以采用仅提供对象的读访问权的接口.该技术同样可以在C++中使用.在我工作的两个真实的C++系统上,几乎没有使用const,一切都运行正常.因此,对于让const污染代码库的有用性,我还远没有卖掉.
我想知道在C++中它是什么让const成为必要,而不是其他编程语言.
到目前为止,我只看到了必须使用const的一种情况:
#include <iostream>
struct Vector2 {
int X;
int Y;
};
void display(/* const */ Vector2& vect) {
std::cout << vect.X << " " << vect.Y << std::endl;
}
int main() {
display(Vector2());
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio接受使用const注释掉的编译,但是使用警告C4239时,使用非标准扩展.所以,如果你想要传递临时代码,避免副本和保持标准兼容的语法简洁,你必须通过const引用,不管它.不过,这更像是一个怪癖,而不是一个根本原因.
否则,实际上不存在必须使用const的情况,除非与使用const的其他代码连接.在我看来,康斯特似乎不是一个自以为是的瘟疫,它蔓延到它接触到的一切:
const在C++中工作的原因是因为你可以把它丢弃.如果你不能把它扔掉,那么你的世界就会糟透了.如果声明一个采用const Bla的方法,则可以将它传递给非const Bla.但如果是相反的方式你不能.如果声明一个采用非const Bla的方法,则不能将它传递给const Bla.所以现在你被卡住了.所以你逐渐需要一个不是const的所有东西的const版本,你最终得到了一个阴影世界.在C++中,你可以使用它,因为与C++中的任何东西一样,无论你是否想要这个检查,它都是纯粹可选的.如果你不喜欢它,你可以打破常量.
Anders Hejlsberg(C#架构师),CLR设计选择
最近我读过,从函数返回值来为非内置类型限定返回类型const是有意义的,例如:
const Result operation() {
//..do something..
return Result(..);
}
Run Code Online (Sandbox Code Playgroud)
我很难理解这个的好处,一旦对象被返回肯定是调用者的选择来决定返回的对象是否应该是const?