返回常量指针(例如 int * const)的函数的用例是什么
What would be an use case for a function returning a const pointer (int * const, for example)?
标题是不言自明的,但我还是会举一个例子。
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++中(针对const
和T*
的不同组合。
指向常量的指针(基元类型(
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
价值观没有任何意义,从来没有,也永远不会有。
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 这里的字符串函数是什么意思
- 这个函数是什么意思(我的英语sry)
- C++ 中的 use 函数是什么?
- C++中的编译时函数是什么?
- 使用 DnsQuery 或 getaddrinfo 的正确函数是什么?
- Lua 中看起来像表的函数是什么?
- "AfxIsValidAddress"函数的等效标准函数是什么?
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- MFC 用于计算控件的高光、阴影等的算法或函数是什么?
- 具有多个非可选参数的转换构造函数是什么样子的?为什么它有意义
- 不确定 c++ 中的常量函数是什么
- 指针的最快散列函数是什么
- 注册用于提升io_service的每个对象的回调函数是什么?
- 在 g++ 中生成 "-L" 和 -rpath 标志的等效函数是什么
- Boost.Python中的dispatch函数和forwarding函数是什么意思
- 给定情况下的良好哈希函数是什么
- C++ 中的"导出函数"是什么意思?
- C++ std::unordered_map 中使用的默认哈希函数是什么