很多 的情况可能会返回一个 const 指针或一个 const 对象。我无法想象任何真实的情况,您希望将原始类型返回为const。
我不确定你的问题是什么,在标题中你在谈论int* const,但在代码示例中你有一个const int。
以下是const 和T* 的不同组合的一些示例(C++ 中)。
指向 const(原始类型)的指针
const int* someFuncion();
您有一个指向常量的指针,这意味着您可以更改指针但不能更改指向的对象/值。请注意someFunction() 不得返回指向堆栈分配变量的指针(const 或不)。我假设指针是有效的。例如:
const int* value = someFunction();
// Next line is valid, value will hold a new pointer
value = anotherFunction();
// Next line is not valid, pointed value cannot be changed
*value = 10;
指向 const(对象)的指针
const T* someFunction();
你有一个指向常量的指针。这意味着您可以更改指针以指向另一个对象,但不能更改指向的对象状态。这并不意味着您不能使用该对象,只是该对象是 const 然后您只能使用其标记为 const 的方法,读取其字段并写入其可变字段。一个常量方法定义为:
void method() const;
它可以有任何返回类型和任何参数,关键是它用const 修饰符标记。这意味着它不会改变对象状态(同样排除mutable对象)。
现在举个例子,T 声明为:
class T
{
public:
void dump() const
{
// Dump the value to console, for example
}
void increaseValue()
{
++m_value;
}
private:
int m_value;
};
想象一下编写以下代码:
const T* value = someMethod();
// Next line is valid, value will hold a new pointer
value = anotherMethod();
// Next line is not valid, we cannot change the object state
value->increaseValue();
// Next line is valid, we do not change the object state
value->dump();
常量指针(原始类型)
int* const someFunction();
您有一个常量指针,这意味着您可以更改指向的值,但不能将另一个内存位置分配给指针本身。例如:
int* const value = someFunction();
// Next line is not valid, value cannot be changed
value = anotherFunction();
// Next line is valid, you can change the variable pointed by value
*value = 10;
常量指针(对象)
T* const someFunction();
您有一个常量指针,这意味着您可以更改指向的对象状态,但不能将另一个内存位置分配给指针本身。例如:
T* const value = someFunction();
// Next line is not valid, value cannot be changed
value = anotherFunction();
// Next lines are both valid, we can do whatever we want with the object
value->increaseValue();
value->dump();
指向常量的常量指针
const int* const someFunction();
这是先前声明的混合。上述所有(限制性)规则均有效。这意味着您无法更改指针,也无法更改指向的值。
注意事项
const 修饰符不限于用于指针和函数返回值。例如:
// PI value cannot be changed
const int PI = 3.14f;
// I have a pointer to a constant value
const* int pPI = Π
// I have a constant pointer to a constant value, note that
const* int const pPI2 = Π
请记住,const 修饰符始终可以使用 C 样式转换或 const_cast 删除。
结论
那么,回到你的问题,返回值 const int 的函数有用吗?
如果它是一个指针,我的答案是 yes,即使它可以通过强制转换移除:const 的目的是 传达 意图(让您免于很难找到愚蠢的错误),因此您的功能可以进行更多的交流,并且可以更好地使用它。从您的上一个示例更新此内容,我的答案是是,在适用的地方使用 const。谁会调用你的代码会感谢你(你会自己做)。
如果它只是一个const int(或其他原始类型),那么您可能很少需要编写类似的东西。很多时候它们只是长时间计算的中间结果,然后将它们声明为const 是没有用的(原始类型不会改变,但会组合起来创建一个新值)。但是请注意,如果将它们声明为const 有意义,那么您应该 这样做。我想更常见的是看到一个常量原始类型声明为局部变量(再次确保它不会被错误地更改)。例如:
// This local variable cannot be modified
const int rate = (calculateX() + calculateY()) / calculateRateFactor();
或者在函数中,为什么不呢?如果您始终使用此规则(const 如果不应该更改),那么您会在参数不是 const 时即时看到,那么您会明白您会在某处修改它(也许用小、隐藏、漂亮的 ++ 位于屏幕最右侧)。
// With this prototype I'm sure I won't change a or b by mistake inside
// the function body.
int someFunction(const int a, const int b);
对于对象,我认为使用 const 修饰符更为常见(因为 const T 返回类型通常很有意义),例如:
// This object cannot be changed, just moved all around
const order* getNextOrderToStore();
话题并没有结束,当然是因为别名、可变变量、运算符重载以及 C 和 C++ 之间的差异......