为什么int不要求是常量和/或在函数中通过引用传递? 我是一个全新的新手,最近买了一本书,题目是“职业C++第四版”。唯一的编码体验就是在魔兽世界中用Lua简单地制作自己的插件

为什么int不要求是常量和/或在函数中通过引用传递? 我是一个全新的新手,最近买了一本书,题目是“职业C++第四版”。唯一的编码体验就是在魔兽世界中用Lua简单地制作自己的插件,c++,C++,问题是为什么“int”不需要是常量或通过引用传递,而“string”必须是常量并通过引用传递 void setFirstName(const std::string& firstName); const std::string& getFirstName() const; void setEmployeeNumber(int employeeNumber); int getEmployeeNumber() const; 我确实得到了常量的概念以及通过引用而不是通过值传递的原因

问题是为什么“int”不需要是常量或通过引用传递,而“string”必须是常量并通过引用传递

void setFirstName(const std::string& firstName);
const std::string& getFirstName() const;

void setEmployeeNumber(int employeeNumber);
int getEmployeeNumber() const;

我确实得到了常量的概念以及通过引用而不是通过值传递的原因。但是为什么整数值不是这样呢?

字符串不需要作为常量或引用传递。如果函数不需要修改或保留字符串的副本,那么这样做会更有效,因为
string
s可以是任意大的,传递值需要复制它们的内容;如果它是通过slurp一个1GB文件生成的
字符串,那么就没有意思了,因此调用该函数需要分配和填充一个稳定的1GB新内存

传递
const
引用,而不是可变引用,是为了避免意外。从调用者的角度来看,
const
引用和按值传递提供了相同的保证:调用者的
字符串
不会改变。但是如果函数接受可变引用,调用方的
字符串可能会因调用而更改,现在如果需要保留原始值,则需要对其进行备份

这些都不意味着你不能以其他方式传递
string
。如果您需要
字符串的个人副本
(以存储超过调用长度,或在不影响调用方的情况下进行变异),(在调用方传递r值的情况下,这将比接收
常量
引用然后进行复制更有效)。如果需要能够改变调用方的值,请通过可变引用接受。但是如果您不需要这样做,那么默认值应该是
const
reference;它很快,并且简化了调用者的API,调用者不需要担心他们的参数会被更改

不过,这种优化与
int
无关。如果
字符串
可以是从少量字节到GB的数据,则
int
的大小是固定的(取决于实现,但通常为2-4个字节),因此按值复制它的成本与传递引用的成本在同一数量级上(可能比实际传递引用稍微便宜一点,因为引用既减少了内存局部性,又通常实现为指针,指针通常比
int
本身大)


关键是,
int
string
都有相同的选项。只是你需要更加小心
string
的拷贝,因为它会增加你的内存使用量,降低你的代码速度;无论你如何传递
int
,都不会有很大的区别。

“[…]而”string“是否为常量并通过引用传递?"-不必。你在哪里读到的?在那本书中?你确定你得到了通过引用传递的原因吗?因为如果你得到了,它显然不适用于整数。如果你解释一下为什么你认为
setFirstName
通过
const&
获取它的参数,可能会有所帮助。如果你理解错误,那么这就是问题所在。因为int的长度为4字节,而引用的长度为8字节(在64位机器上)。因此,复制int的成本低于通过ref传递int。常量和
const
是两件不同的事情。常量表达式可以在编译时计算。
const
表示只读。