请考虑以下类似类的“智能指针”。它包含一个指向另一个实现了虚拟副本构造函数clone()
的类的指针。
我想使operator ->
超载。我的资料显示了两个实现,一个const
和一个非const
的实现-我很好。我知道后者const
意味着它无法更改基础字段变量,而前者返回类型为const
。但是,返回类型和运算符之间的关键字是什么意思? -即中间一个。
class myClass
{
public:
myClass(const SomeClass& inner) {DataPtr = inner.clone();}
~MyClass() {delete DataPtr;}
SomeClass* operator->() {return DataPtr;}
const SomeClass* const operator->() const {return DataPtr;}
private:
SomeClass* DataPtr;
};
答案 0 :(得分:1)
const SomeClass* const
在这种情况下,const
是返回类型的一部分。这可以是有效的C代码。与往常一样,从右到左阅读:
const
指向const
SomeClass
实例的指针。这意味着指针本身是const
,并且指针不能通过指针修改。请注意,在您的示例中,最右边的const
是无用的,因为您要按值返回:它与返回const int
相同。
答案 1 :(得分:1)
并且前者返回类型为const
实际上,不。前者(即Jenkins.getInstance()
的第一个const)意味着返回类型是指向const的指针。这意味着无法使用指针修改指向的对象。
但是返回类型和运算符之间的关键字是什么意思?
它是类型的一部分。
类型名称中的 const始终适用于左侧的内容(除非const是最左侧的标记,在这种情况下,它适用于右侧)。在这种情况下,我们正在考虑的const左侧有一个const SomeClass* const
。这意味着指针是const,即指针本身无法修改。
返回非类类型的const值(在这种情况下为const指针)是不明智的,因为constness对程序的行为没有影响。如果这样做,某些编译器将发出警告。我建议删除有问题的const。
即使对于类类型,虽然在某些情况下可能有所不同,但我不知道返回const值的任何实际用例。但是,返回指向const的指针或引用确实有意义。