这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是const。通常当班级是帮助“自动化”某些程序时
例如:
Is this the OK scoped way to get random element from the container?
如果查看代码,很明显,如果更改传递给构造函数的容器,则以后类功能会被破坏。那么有没有办法让函数“需求”const而不是“promise”const。
示例:
int f(const vector<int>& v)
{
return v.size();
}
int main()
{
vector<int> v;
v.push_back(42); // can f be changed to reject v because it is not const
cout << f(v);
}
答案 0 :(得分:5)
声明但不实现非const版本。
int f(vector<int>& v);
尝试传递非const向量将被解析为此函数,然后您将收到链接器错误,因为不存在此类函数。
某些精美的模板游戏可能会将其变成编译时错误。
答案 1 :(得分:2)
没有办法保证这一点。如果你想确定对象没有改变,它应归类所有。实现这一目标的一种方法是将要保持不变的对象复制到类中,或者如果使用C ++ 11让构造函数采用rvalue-reference,则移动对象。
答案 2 :(得分:0)
如果您希望类中的某些属性不受任何外部更改的影响,则应将构造函数复制到属性const TypeName _attr;
。
答案 3 :(得分:0)
我不认为,这是可能的。
如果有可能,你仍然可以这样做
Object mutable_;
const Object & notMutavle = mutable_;
func(notMutable);
mutable.change();
无论如何,即使const
对象的状态可能会被更改,如果它有一些mutable
字段。
如果你想确定,没有人改变你的对象,你应该自己管理它。
答案 4 :(得分:0)
您可以通过重载非const引用的函数来实现。
下一个例子说明了这一点。但是,f的第一个版本应该抛出异常而不是返回-1。
#include <vector>
#include <iostream>
int f(std::vector<int>& )
{
return -1;
}
int f(const std::vector<int>& v)
{
return v.size();
}
int main()
{
std::vector<int> v;
v.push_back(42); // can f be changed to reject v because it is not const
std::cout << f(v)<<std::endl;
const std::vector<int> cv(5);
std::cout << f(cv)<<std::endl;
}