何时在函数args中使用常量和常量引用? 当编写一个具有传递给它的ARG的C++函数时,如果可以保证对象不变,或者指针不变,则始终使用const。

何时在函数args中使用常量和常量引用? 当编写一个具有传递给它的ARG的C++函数时,如果可以保证对象不变,或者指针不变,则始终使用const。,c++,arguments,constants,C++,Arguments,Constants,还有什么时候建议这种做法 什么时候会使用const引用?例如,与只通过指针传递它相比,它有什么优势 如果字符串实际上已经是一个不可变对象,那么使用常量字符串有什么意义呢?一般规则是,尽可能使用constconst可以使编译器进行优化,并帮助您的同事了解代码的使用方式(并且编译器将捕获可能的误用) 至于你的例子,字符串在C++中不是不可变的。如果将字符串的非const引用传递给函数,函数可能会修改它。C++没有内置到语言中的不可变概念,只能使用封装和 const (它永远不会是防弹的)来仿真它。

还有什么时候建议这种做法

什么时候会使用const引用?例如,与只通过指针传递它相比,它有什么优势


如果字符串实际上已经是一个不可变对象,那么使用常量字符串有什么意义呢?

一般规则是,尽可能使用
const
const
可以使编译器进行优化,并帮助您的同事了解代码的使用方式(并且编译器将捕获可能的误用)

至于你的例子,字符串在C++中不是不可变的。如果将字符串的非

const
引用传递给函数,函数可能会修改它。C++没有内置到语言中的不可变概念,只能使用封装和 const (它永远不会是防弹的)来仿真它。
在考虑了@Eamons的评论并阅读了一些资料之后,我同意优化不是使用
const
的主要原因。主要原因是要有正确的代码。

与常量指针相比,常量引用的主要优点如下:很明显,参数是必需的,不能为NULL。
反之亦然,如果我看到一个常量指针,我立即假设它不是引用的原因是参数可能为NULL。

这些问题基于一些不正确的假设,因此没有真正意义

std::string
不为不可变的字符串值建模。它为可变值建模

没有所谓的“常量引用”。有对
const
对象的引用。这种区别虽然微妙,但很重要

函数参数的顶级
const
仅对函数实现有意义,而对纯声明没有意义(编译器忽略该声明)。它没有告诉打电话的人任何事情。这只是对实施的限制。例如,
int const
在函数的纯声明中作为参数类型几乎没有意义。但是,
std::string const&
中的
const
不是顶级

通过引用传递到
const
可避免数据复制效率低下。通常,对于将数据传递到函数中的参数,可以通过值传递小项(例如
int
),通过引用
const
传递可能更大的项。在机器代码中,
const
的引用可以优化掉,也可以作为指针实现。例如,在32位窗口中,
int
是4个字节,指针是4个字节。因此,参数类型
int const&
不会减少数据复制,但如果使用简单的编译器,可能会引入额外的间接寻址,这意味着效率稍低,因此存在小/大的区别


干杯&hth.,

很遗憾,询问是否添加常量是错误的问题

比较非常量ref与传递非常量指针 本例主要是关于样式:您希望调用看起来像
call(obj)
还是
call(&obj)
?然而,有两点不同很重要。如果希望能够传递null,则必须使用指针。如果重载运算符,则不能使用指针

将常量ref与按值进行比较 这是一个有趣的案例。经验法则是“复制成本低”类型通过值传递-这些通常是小类型(但不总是)-而其他类型通过const ref传递。但是,如果您需要在函数中创建副本,则您可以。(是的,这暴露了一些实现细节。C'ESLE C++)< /P> 将常量指针与非修改加重载进行比较 这与上面的非修改情况有关,只是传递参数是可选的。这三种情况之间的差别最小,所以选择哪一种让你的生活最简单。当然,非常量指针的默认值由您决定

constbyvalue是一个实现细节 这些声明实际上是完全相同的函数!当传递值时,const纯粹是一个实现细节


我认为编译器根本无法基于const注释优化任何东西-const并不意味着不可变,只是缺少在此范围内更改的意图。+1提醒字符串不是不可变的-这非常重要@Eamon:关于从
const
进行优化的一些优点和缺点。原因1:String的可能重复不是不可变的。原因2:能够传递字符串文字、c字符串或右值。如果采用普通引用,则不会应用任何转换,也不能传递临时对象,因为人们通常使用术语“const reference”,意思是“对const objets的引用”。。。我想说,前者——鉴于它没有其他可能的含义或解释——是讨论后者的非正式方式,而不是在不存在的东西和存在的东西之间存在微妙的区别;-)。您可以对非
const
对象进行
const
引用。
const
-ness(哪怕是一个单词?)是引用的属性,而不是对象的属性。@Tony:这里的准确术语问题是非常现实的。“constpointer”与“指向const的指针”有很大的不同(即使一些微软程序员不这么认为)。MSVC的“T&const”(一个“const引用”)会导致编译器发出“使用了错误的年代:引用上的限定符被忽略了”的惊叹声,因此,尽管对某些人来说这显然是不可想象的,但它曾一度被明显接受
void modifies(T &param);
void modifies(T *param);
void doesnt_modify(T const &param);
void doesnt_modify(T param);
void optional(T const *param=0);
// vs
void optional();
void optional(T const &param); // or optional(T param)
void f(T);
void f(T const);
void f(int);
void f(int const) {/*implements above function, not an overload*/}

typedef void C(int const);
typedef void NC(int);
NC *nc = &f;  // nc is a function pointer
C *c = nc;  // C and NC are identical types