你觉得它有帮助吗?你经常声明你的函数是const吗?
回答
每次你知道该方法不会改变对象的状态时,你应该声明它是不变的。
它有助于阅读您的代码。当你试图改变对象的状态时它会有所帮助 - 编译器会阻止你。
如果函数甚至没有触及对象状态,而只是将输入参数转换为返回值,那么它应该是静态的。静态>常量成员>普通成员。 – Lucas 2010-03-11 00:04:43
如果您有const
对象,则编译器允许您调用的唯一方法是那些由const
关键字标记为安全的方法。实际上,只有成员方法才有意义,如const
方法。
在C++中,对象的每种方法都会收到指向对象的隐式指针this
;一个const
方法将简单地收到一个const
this
指针。
假设你正在谈论方法,如:
struct Example {
void f() const;
};
当然,如果他们应该是一个const对象上调用,该方法应该是常数。
尽可能经常。不需要更改数据成员的函数应该声明为const。这使代码更易于理解,并可能会提示编译器进行优化。
不经常不够....
虽然所有的答案是正确的,如果你使用的是libary不是const correct话,就很难使用常量你应该使用它的地方。
如果你有一个旧的API,需要一个的char *,对于所有逻辑的目的应该是为const char *,那么你要么必须忘记常量在你的代码或者做一些丑陋的铸造。在那种情况下,我忘记了const。
另一种方法是封装API并确定它是否真的应该花费成本数据,如果是这样,则在您的包装器中丢弃输入数据的常量。这意味着你只需要丑陋的铸造一次,你可以评论你通过你的测试确定这是安全和正确的事实等。恕我直言,大多数,如果不是所有'旧的API'应该被包装... – 2010-03-10 07:37:18
我曾经把函数声明为const,但现在我很少再做它了。
主要问题是,如果我想将一个函数从const更改为非const,则意味着调用该函数的所有其他const函数也需要更改为非const。
由于优化,发生的次数比我想象的要多。例如,我有一个GetData()函数,它用于返回一个指向数据的指针,但后来我进行了优化,只在GetData()最终被调用时才设置数据(这会更改对象的状态,所以它不再是一个常量功能)。
同样的事情可以做一些计算而不改变对象的状态,但在某些时候更有意义的缓存结果,因为该函数被调用很多次,并且是一个瓶颈。
另外在实践中,至少对于我的项目,我看到将我的函数声明为const的好处很少。
功能哪不改变“逻辑值”仍然可以是const,你只需要为你的缓存使用可变数据成员。 – 2010-03-10 07:58:01
是的,同意罗杰的评论。声明为mutable的数据成员可以在const函数内进行更改。 – jasonline 2010-03-10 08:08:18
我在几乎每一个机会都使用const,并且就像它提供了两个意向文档并强制符合该意图。语言特征并没有比这更好,然而const好奇地不受欢迎。(现实情况似乎是,大多数自称为C++程序员不能解释int*, int*const, const int*
和const int*const
之间的区别。)
虽然它可能永远不会发生,因为它“C”的起源,我常常想,C++会如果const是默认值,并且需要(比如说)'var'或一些类似的关键字以允许在构建后修改变量,那么将其作为更好的语言。
- 1. 你可以在VBScript中声明一个常量数组吗?
- 2. 你可以结合CSS声明吗?
- 3. 你能解释一下这个奇怪的函数声明行为吗?
- 4. 为什么你不能调用括号内声明的函数?
- 5. 如何声明extern(“C”)const函数?
- 6. 你是否只需要调用声明和原型声明“声明”?
- 7. 你可以将一个DataTable声明为一个数组吗?
- 8. 在ColdFusion 8中,你可以使用cfscript声明一个函数为private吗?
- 9. 你能像这样在ASP经典中声明一个变量吗?
- 10. 你可以声明一个可变长度的泛型类型声明吗?
- 11. 在什么情况下你会声明一个非引用,非指针类型的函数参数const?
- 12. 你可以声明Angular 2中的Attribute指令的顺序吗?
- 13. 你生成你的数据字典吗?
- 14. 为什么你不能在Ruby的方法中声明常量?
- 15. 经常性声明c
- 16. 你曾经对你自己的Forked repo做过pull request吗?
- 17. 找不到'Track'的超类'Object'的接口声明;你的意思是'NSObject'吗?
- 18. 使用未声明的标识符'nothrow';你的意思是'扔'吗?内存
- 19. 使用未声明的标识符'top';你的意思是'流行'吗?
- 20. 你如何声明班级内联?
- 21. 你如何阅读C声明?
- 22. 你可以改变Twilio的声音吗?
- 23. 当你调用成员函数时,你可以调用friend函数吗?
- 24. C#:你如何管理项目中的符号常量?你在哪里声明解决方案范围常量?
- 25. 你能解释一下这个枚举声明吗?
- 26. 你可以在WebBrowser中声明一个InputScope吗?
- 27. 你可以在C++中声明一个指针作为extern吗?
- 28. 你可以在堆上声明一个指针吗?
- 29. const结构声明
- 30. 你可以在iPhone上使用C open(const char * name,int flag)函数吗?
不断! (对不起,不由自主) – Thilo 2010-03-10 07:24:11