在Effective C++第03项中,尽可能使用const.
class Bigint
{
int _data[MAXLEN];
//...
public:
int& operator[](const int index) { return _data[index]; }
const int operator[](const int index) const { return _data[index]; }
//...
};
Run Code Online (Sandbox Code Playgroud)
const int operator[]确实有所作为int& operator[].
但是关于:
int foo() { }
Run Code Online (Sandbox Code Playgroud)
和
const int foo() { }
Run Code Online (Sandbox Code Playgroud)
似乎他们是一样的.
我的问题是,为什么我们用const int operator[](const int index) const而不是int operator[](const int index) const?
最近我读过,从函数返回值来为非内置类型限定返回类型const是有意义的,例如:
const Result operation() {
//..do something..
return Result(..);
}
Run Code Online (Sandbox Code Playgroud)
我很难理解这个的好处,一旦对象被返回肯定是调用者的选择来决定返回的对象是否应该是const?
假设我有一个声明函数返回const类型的库:
class Foo { ... };
const Foo makeFoo();
Run Code Online (Sandbox Code Playgroud)
现在我想const从makeFoo()返回类型中删除(请参阅我之前的问题).我可以const从头文件和cpp文件中删除它们,重建库,并将我的代码链接到新库.但是,我还有动态链接到此库的旧代码,我希望它继续使用新版本的库.
那么,第一个问题,是否const从返回类型中删除了ABI?
第二个问题,实际代码是完全不同的:它是一个具有静态成员函数的模板类,稍后将显式实例化:
// fooMaker.h
template<class Foo>
class FooMaker {
public:
static const Foo make();
};
// fooMaker.cpp
template<class Foo>
const Foo FooMaker<Foo>::make() { ... }
template class FooMaker<Foo1>;
template class FooMaker<Foo2>;
Run Code Online (Sandbox Code Playgroud)
它改变了什么吗?
如果这很重要,我在linux下使用g ++.