- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这个问题在这里已经有了答案:
10年前关闭。
Possible Duplicate:
How to pass objects to functions in C++?
class Vector
{
float x, y;
};
Float RandomCalculation( Vector a, Vector b )
{
return a.x * b.x / b.x - a.x * RANDOM_CONSTANT;
}
// versus..
Float RandomCalculation( Vector& a, Vector& b )
{
return a.x * b.x / b.x - a.x * RANDOM_CONSTANT;
}
// versus..
Float RandomCalculation( const Vector& a, const Vector& b )
{
return a.x * b.x / b.x - a.x * RANDOM_CONSTANT;
}
最佳答案
路过 const
引用是传递对象的首选方式,作为按值传递的智能替代方法。当你路过时const
引用,您通过引用获取参数(避免制作它的任何拷贝),但不能对原始对象进行任何更改(就像按值获取参数时会发生的情况一样)。
如果考虑这三个函数:
void VersionOne(Vector v);
void VersionTwo(Vector& v);
void VersionThree(const Vector& v);
Vector
时调用复制构造函数。以便它拥有自己的
Vector
的本地拷贝.如果您的复制构造函数需要一段时间运行或进行大量资源分配和释放,这可能会很慢,但您可以对参数进行任何您想要的更改,而不会冒任何更改传播回调用者的风险。随着参数被清除,函数末尾还会有一个析构函数调用,如果这个代价太大,最好避免这种设置。也就是说,对于小物体,它可能是完全可以接受的。
Vector
通过引用,这意味着该函数可以对
Vector
进行任何它想要的更改。并且更改将传播回调用者。每当你看到一个函数接受非
const
的参数时引用,像这样
VersionTwo
函数,您应该假设它将修改参数,因为如果它不进行任何修改,它将被
const
占用。引用。如果您需要对
Vector
进行更改,您很可能会通过引用获取该值。 ;例如,通过旋转它、缩放它等。这里涉及的一个权衡是
Vector
当它被传递到这个函数时不会被复制,因此你将避免调用复制构造函数和析构函数。这可能会对您的程序产生性能影响,但如果这是您的推理,您可能应该通过
const
引用。需要注意的一点是,跟随引用与跟随指针非常相似(实际上,大多数引用的实现只是将它们视为自动取消引用的指针),因此每次访问数据通过引用。但是,只有分析才能告诉您这是否是一个主要问题,除非您有特定的理由认为它有问题,否则我不会担心。
Vector
来自
const
引用,就像通过常规引用传递一样,避免了任何复制。但是,当服用
Vector
来自
const
引用,您不得对
Vector
进行任何更改在函数内部,所以客户可以假设
Vector
不会被修改。 (是的,从技术上讲,如果它写得不好或具有
mutable
数据成员,则可以对其进行修改,但我们现在将忽略它。这是此处重要的高级思想)。如果您希望能够检查函数中的值而不复制它并且不改变它,那么这个选项会很好。
const
之间还有一个区别-reference,这就是函数在右值上的行为。如果您有临时的
Vector
对象 - 或者您通过编写
Vector()
显式创建它或者对它进行一些数学运算,比如写
v1 + v2
- 那么你不能通过那个临时
Vector
进入一个通过引用获取其参数的函数,因为引用只能绑定(bind)到左值。这个想法是,如果你有这样的功能:
void DoSomething(Vector& v) {
v.x = 0.0f;
}
DoSomething(v1 + v2);
x
临时表达式的字段。为了防止这种情况,编译器将拒绝编译此代码。
const
为参数的函数中。引用,因为从直觉上讲,您不应该通过
const
修改对象。引用。因此这段代码是完全合法的:
void DoSomething(const Vector& v) {
cout << v.x << endl;
}
DoSomething(v1 + v2);
const
-reference 暗示类似的事情 - 您希望能够查看该值而不能修改它。 const
- 引用而不影响程序的正确性。但是,在引用的间接性与复制和破坏参数的成本之间存在性能权衡。 const
-reference 应该用于表示“我想修改参数”。 const
参数的函数。引用。 关于c++ - 作为 const 和通过引用传递 - 值得吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5060137/
我正在生成代码,其中我恰好将 n 个单词从一个内存位置复制到另一个非重叠内存位置。 n 是静态已知的。 目前,我发出大量加载指令,然后是大量存储指令,但我怀疑从 n 的某个值开始,调用 memcpy会
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
用例如下: 我有一张 map ,其中将插入一些键/值。 该程序将查询该 map ,但是在第一个查询之后,我可以保证该 map 将完全不会被修改。 因为查询的结果完全是输入的函数,所以在查询方法上放置属
Helo 伙计们,我尝试使用 Refs 并在他的内部提供 this.setState 但它给出: Maximum update depth exceeded. This can happen when
在检查事件时,使用带有 switch 或 if 的代码块是很常见的事情。如果变得简单,它可以是干净的代码,但似乎仍然有比需要更多的行,并且可以使用 lambda 进行简化。 用 if 阻止: if(a
Amazon 最近宣布在其 RDS 产品线中支持 Oracle: http://aws.amazon.com/rds/oracle/ 我想知道是否有人使用过它,或者是否有令人信服的理由将我的数据从 M
我是一名优秀的程序员,十分优秀!