返回const指针的函数(例如int * const)的用例是什么?

时间:2012-03-19 19:16:17

标签: c++ c const

标题是自我解释的,但我会举一个例子。

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 呢?有这个原因吗?

4 个答案:

答案 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

以下是constT*的不同组合的一些示例(在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返回值的函数?

如果它是一个指针我的回答是,即使可以使用强制转换删除它: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中没有任何意义,从来没有,而且永远不会有。