这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?
虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:
c++ c++-faq copy-constructor assignment-operator copy-and-swap
我经常使用const对象的指针,就像这样......
const int *p;
Run Code Online (Sandbox Code Playgroud)
这只是意味着您无法更改p指向的整数p.但是我也看到了const指针的引用,这样宣称......
int* const p;
Run Code Online (Sandbox Code Playgroud)
据我所知,这意味着指针变量本身是不变的 - 你可以改变它整天指向的整数,但你不能指出其他东西.
有什么可能的用途?
我读过Scott Meyers编写的Effective C++ 3rd Edition.
本书的第3项" const尽可能使用",如果我们想要防止rvalues被意外地分配给函数的返回值,那么返回类型应该是const.
例如,增量函数iterator:
const iterator iterator::operator++(int) {
...
}
Run Code Online (Sandbox Code Playgroud)
然后,防止了一些事故.
iterator it;
// error in the following, same as primitive pointer
// I wanted to compare iterators
if (it++ = iterator()) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,std::vector::iteratorGCC中的迭代器不返回const值.
vector<int> v;
v.begin()++ = v.begin(); // pass compiler check
Run Code Online (Sandbox Code Playgroud)
这有什么理由吗?
最近,我一直在开发一种在我的代码中做很多事情的做法const:
(1)功能论证,我知道永远不会改变.例如:
void foo (const int i, const string s)
^^^^^ ^^^^^
Run Code Online (Sandbox Code Playgroud)
(2)返回类型为const.例如:
struct A {
...
const int foo () { return ...; }
^^^^^
operator const bool () const { return ...; }
^^^^^
};
Run Code Online (Sandbox Code Playgroud)
(3)整数或字符串的平凡计算.例如:
const uint size = vec.size();
^^^^^
const string s2 = s1 + "hello ";
^^^^^
Run Code Online (Sandbox Code Playgroud)
......还有更多的地方.通常在其他现实世界的代码中,我没有看到标记为的这种小规模变量const.但我想,让它们const永远不会受到伤害.这是一个很好的编程习惯吗?
可能的重复:
char * const和const char *有什么区别?
const char * const vs const char *?
当我们在c中定义一个函数时,我们可以使用(const char * str),(char const * str)或(char * const str)作为变量。它们之间有什么区别?