标题是自我解释的,但我会举一个例子。
int sum(int a, int b){
return a + b;
}
我们可以将其重写为
int sum(const int a, const int b){
return a + b;
}
但是返回一个const int呢?它有用吗?
const int sum(const int a, const int b){
return a + b;
}
调用者必须将const返回值复制到const左值。这太限制了吗?你知道任何可能是一个很好的设计选择的用例吗?
好的,我对问题机构不清楚。考虑一个与程序集添加类似的sum函数:
int *sum(int *a, int b){
*a += b;
return a;
}
将常量添加到参数:
int *sum(int * const a, const int b){
*a += b;
return a;
}
如何回归 const 呢?有这个原因吗?
答案 0 :(得分:3)
我只能将此视为意图陈述的好事。
- if you get this value, you shouldn't need to change it
意义上的更多内容,超过don't change this value
。
这实际上除了意图之外什么都没有,因为你无论如何都可以改变价值:http://ideone.com/Mf8Ge
答案 1 :(得分:2)
有一种很多的情况,你可以返回一个const指针或一个const对象。我无法想象你想要将原始类型作为const
返回的任何真实的情况。
我不确定您的问题是什么,在标题中您正在谈论int* const
,但在代码示例中您有const int
。
以下是const
和T*
的不同组合的一些示例(在C ++中)。
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 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
返回值的函数?
如果它是一个指针我的回答是是,即使可以使用强制转换删除它: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 ++之间的差异......
答案 2 :(得分:1)
不,我看到很少有这种情况会有用,因为它确实没有做任何事情,并且它限制了调用者可以对返回值做什么。
答案 3 :(得分:0)
调用者必须将const返回值复制到const lvalue。
不,它根本不会。事实上,它可能永远不会复制它。或者它可能会将其复制到可变的左值。
在const
rvalues中没有任何意义,从来没有,而且永远不会有。