可能重复:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?规则在C++中使用参考
在C++中有没有那种什么时候一个必须的规则或指导,或者至少应该选择使用通过引用比通过值?
如果是有关对象的大小,尽可能知道有些对象(小老实点)它可能变得很难判断。
可能重复:
How to pass objects to functions in C++?
Why pass by const reference instead of by value?规则在C++中使用参考
在C++中有没有那种什么时候一个必须的规则或指导,或者至少应该选择使用通过引用比通过值?
如果是有关对象的大小,尽可能知道有些对象(小老实点)它可能变得很难判断。
只要你想改变参数在函数外部可见,你应该通过引用传递。这是通过非const
参考,主要是由逻辑,而不是效率的动机。
当您处理的数据类型的大小大于寄存器的大小时,您应该通过(主要是const
)引用。由于参考文献主要是const
,因此您无法对其进行任何更改,所以这是由效率驱动的。
即使对于较大的对象,通过值传递通常也比参考更快,因为缺少“restrict”。 – Pubby
注意:即使对于小数据类型,手工制作的拷贝构造函数的存在也会鼓励您使用'const&'。这个惯用的例子是'shared_ptr',它并不像许多人想象的那么轻量级。 –
swap(a,b)
,例如 - 因为你实际上是在以使交换需要原始引用。)通常情况下,我在使用通过引用传递以下几种情况:
1)objetc是大小比指针更大:在这种情况下,如果我不想再修改objetc,使用const引用:
Reference object;
foo(object);
以foo声明为:
void foo(const Reference & object);
2)对于码澄清,试图避免这样thigs:
int f1 = xxx;
int f2 = yyy;
int f3 = zzz;
....
foo(f1, f2, ............)
使用的结构:
struct X
{
int f1;
int f2;
int f3;
....
};
X x;
x.f1 = xxx;
.....
foo(X);
以foo定义为:
foo(const X & x);
3)加速倾注:请记住,调用函数必须将参数4)你需要修改函数中的参数。
Reference object;
foo(object);
以foo声明:
void foo(Reference & object);
不想pass-by-reference-to-const
到pass-by-value
。按值传递是一项昂贵的操作,因为对象的副本是由复制构造函数生成的。另外,如果类中有一些非原始数据成员(例如:std::string
),则每次创建类的新对象时,也会创建这些std::string
对象。
通过引用也可以避免slicing problem
。如果通过值将派生类对象传递给期望基类对象的函数,派生类的派生特征将被切掉,并且函数内部的对象将表现为基类对象。如果通过参考传递,可以避免切片。
尽管如此,有些情况下您不能通过引用传递。如果你的函数参数或返回值需要有NULL值,你不能使用引用。
看到这个答案:http://stackoverflow.com/a/114351/6345(指针与参考) –
同样的问题被问了这么多次在这个网站上... http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c – nogard
一个比较好的规则:if(sizeof(SomeType)> sizeof(void *))//使用引用' –