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

What would be an use case for a function returning a const pointer (int * const, for example)?

本文关键字:函数 是什么 const 指针 常量 例如 int 返回      更新时间:2023-10-16

标题是不言自明的,但我还是会举一个例子。

int sum(int a, int b){
    return a + b;
}

我们可以将其重写为

int sum(const int a, const int b){
    return a + b;
}

但是返回一个常量整数呢?它有什么用吗?

const int sum(const int a, const int b){
    return a + b;
}

调用方必须将常量返回复制到常量左值。这是不是限制太多了?您知道任何用例中这可能是一个不错的设计选择吗?

好的,我在问题正文中不清楚。考虑一个类似于程序集加法的求和函数:

int *sum(int *a, int b){
    *a += b;
    return a;
}

将常量添加到参数中:

int *sum(int * const a, const int b){
    *a += b;
    return a;
}

也做回报呢?这有什么原因吗?

很多情况下,您可能会返回 const 指针或 const 对象。我无法想象您想要将基元类型返回为const的任何真实情况.

我不确定你的问题是什么,在标题中你谈论int* const但在代码示例中你有一个const int.

以下是一些示例(C++中(针对constT*的不同组合。

指向常量的指针(基元类型(

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 = Π

请记住,始终可以使用 C 样式转换或 const_cast 删除const修饰符。

结论

那么,回到你的问题,具有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++ 之间的差异......

我只能将其视为意图声明的好事。

更多意义上的东西 - if you get this value, you shouldn't need to change it ,不仅仅是don't change this value.

这实际上只执行意图,因为您无论如何都可以更改值:http://ideone.com/Mf8Ge

不,我认为这在很少的情况下有用,因为它实际上什么也没做,并且它限制了调用者可以对返回值执行的操作。

调用方必须将常量返回复制到常量左值。

不,根本不会。事实上,它可能永远不会复制它。或者它可能会将其复制到可变的左值。

const价值观没有任何意义,从来没有,也永远不会有。