Jas*_*ker 121 c++ const-correctness
那么为什么总是建议尽可能经常使用const呢?在我看来,使用const可能比C++中的帮助更痛苦.但话说回来,我是从python的角度来看这个:如果你不想改变某些东西,不要改变它.所以说,这里有几个问题:
似乎每次我将某些东西标记为const时,我都会收到错误,并且必须将某些其他函数更改为const.然后这导致我必须在其他地方更改另一个功能.这是通过经验变得更容易吗?
使用const的好处真的足以弥补麻烦吗?如果您不打算更改对象,为什么不编写不会更改它的代码?
我应该注意到,在这个时间点,我最关注的是使用const来实现正确性和可维护性的好处,尽管了解性能影响也很好.
Jor*_*mer 151
这是关于"const correctness"的权威性文章:https://isocpp.org/wiki/faq/const-correctness.
简而言之,使用const是一种很好的做法,因为......
编译器可以优化它.例如,您受到保护
if( x = y ) // whoops, meant if( x == y )
Run Code Online (Sandbox Code Playgroud)同时,编译器可以生成更高效的代码,因为它确切地知道变量/函数的状态.如果您正在编写严格的C++代码,这很好.
你是正确的,因为一致地使用const-correctness可能很困难,但最终代码更简洁,更安全.当你做很多C++开发时,这种好处很快就体现出来了.
Dou*_* T. 123
这是一段带有常见错误的代码,const正确性可以保护您免受:
void foo(const int DEFCON)
{
if (DEFCON = 1) //< FLAGGED AS COMPILER ERROR! WORLD SAVED!
{
fire_missiles();
}
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*yer 60
似乎每次我将某些东西标记为const时,我都会收到错误,并且必须将某些其他函数更改为const.然后这导致我必须在其他地方更改另一个功能.这是通过经验变得更容易吗?
从经验来看,这是一个完整的神话.当非const-correct与const-correct代码坐在一起时,肯定会发生这种情况.如果你从一开始就设计const-correct,那绝不应该是一个问题.如果你做了一些const,然后别的东西不能编译,编译器告诉你一些非常重要的东西,你应该花时间正确地修复它.
Ant*_*ley 30
在您最初编写代码时,它不适合您.这是为了其他人(或几个月之后),他们正在查看类或接口中的方法声明以查看它的作用.不修改对象是从中收集的重要信息.
QBz*_*ziZ 25
如果你严格使用const,你会惊讶于大多数函数中的实数变量很少.通常只不过是一个循环计数器.如果你的代码达到了这一点,你会感觉内心温暖......通过编译验证......函数式编程的领域就在附近......你现在几乎可以触摸它...
Joh*_*McG 21
const是您作为开发人员所做的一项承诺,并且在编写程序帮助时强制执行.
我的正确理由:
Pat*_*otz 19
我的理念是,如果你打算使用一种挑剔的语言进行编译时检查,那么就可以充分利用它. const是一种编译器强制执行的方式来表达你的意思 ......它比评论或doxygen更好.你付出了代价,为什么不拿出价值呢?
and*_*ykx 19
没有const的C++编程就像没有安全带的驾驶一样.
每次踏入汽车时都要戴上安全带,而365天中的安全带会安全到达.
唯一的区别是当你遇到汽车问题时你会立刻感受到它,而对于没有const的编程,你可能需要搜索导致该崩溃的两周时间才发现你无意中搞砸了一个函数参数你通过非const引用来提高效率.
bk1*_*k1e 16
对于嵌入式编程,const在声明全局数据结构时明智地使用可以通过使常量数据位于ROM或闪存中而无需在引导时复制到RAM来节省大量RAM.
在日常编程中,const小心使用可以帮助您避免编写崩溃或行为不可预测的程序,因为它们会尝试修改字符串文字和其他常量全局数据.
在大型项目上与其他程序员合作时,const正确使用有助于防止其他程序员限制您.
Chr*_*ung 12
const帮助您隔离背后"改变事物"的代码.因此,在类中,您将标记所有不会更改对象状态的方法const.这意味着const该类的实例将不再能够调用任何非const方法.这样,您就不会意外调用可以更改对象的功能.
此外,它const是重载机制的一部分,因此您可以使用两个具有相同签名的方法,但是一个方法有一个,const一个没有.一个const用于const引用,另一个用于非const引用.
例:
#include <iostream>
class HelloWorld {
bool hw_called;
public:
HelloWorld() : hw_called(false) {}
void hw() const {
std::cout << "Hello, world! (const)\n";
// hw_called = true; <-- not allowed
}
void hw() {
std::cout << "Hello, world! (non-const)\n";
hw_called = true;
}
};
int
main()
{
HelloWorld hw;
HelloWorld* phw1(&hw);
HelloWorld const* phw2(&hw);
hw.hw(); // calls non-const version
phw1->hw(); // calls non-const version
phw2->hw(); // calls const version
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*acs 12
const正确性是从一开始就真正需要的东西之一.正如您所发现的,稍后添加它会非常困难,特别是当您添加的新函数与已存在的旧非常量函数之间存在很多依赖关系时.
在我编写的很多代码中,它确实值得付出努力,因为我们倾向于使用很多组合:
class A { ... }
class B { A m_a; const A& getA() const { return m_a; } };
Run Code Online (Sandbox Code Playgroud)
如果我们没有const-correctness,那么你将不得不求助于按值返回复杂对象,以确保没有人在你背后操纵B级的内部状态.
简而言之,const-correctness是一种防御性编程机制,可以帮助您避免痛苦.
假设你在Python中有一个变量.你知道你不应该修改它.如果你不小心怎么办?
C++为您提供了一种方法来保护自己不会意外地做一些您本来不应该做的事情.从技术上讲,无论如何你都可以绕过它,但是你必须投入额外的工作来拍摄自己.
| 归档时间: |
|
| 查看次数: |
21904 次 |
| 最近记录: |