C ++中的任何默认通过引用数据类型?

时间:2011-01-18 12:45:06

标签: c++

我理解,与C#不同(其中类通过引用传递并且struct默认传递),C ++中的结构和类都通过值传递给方法,除非它被显式修改为通过引用传递。

即,

// this is a method that passes by reference
void PassReferenceOp(MyClass &myclass, MyStruct &myStruct)
{
}



// this is a method that passes by value
void PassReferenceOp(MyClass myclass, MyStruct myStruct)
{
}

我的问题是,是否没有数据结构,C ++中的数据类型通过引用传递给方法?无论我使用的是std::liststd::list::iteratorstd::map,还是我创建的任何数据类型,无论是结构还是类,都是通过引用传递的?

5 个答案:

答案 0 :(得分:4)

引用类型没有默认传递。当然,有些引用是通过值传递的(最值得注意的是,智能指针),你可以争论一段时间之间的区别。

不是我看到了重要性。添加&几乎不是困难或浪费时间的缩影。

答案 1 :(得分:3)

最接近你想要的不是传递参考,而是使用指针。

Java和C#中的引用与指针的关系比与C ++引用的关系更密切:C ++中的引用是对象的别名,相当于C#中的ref关键字,而C#/ Java中的引用是一个引用(指向)实例的实体(作为C / C ++中的指针)。

以下两个是等效的(假设C#中的结构类型):

void foo( type& param );     // c++
void foo( ref type param );  // c#

现在对于引用类型,等效的是:

void foo( type* param );     // c++
void foo( type param );      // c#

不同的是,c ++中的指针不会自动解除引用,即您必须使用operator->而不是.来访问成员。

答案 2 :(得分:1)

默认情况下,所有C ++参数都按值传递。使用&表示参考。

答案 3 :(得分:1)

C ++有不同的参数传递和赋值语义。是通过值,引用还是通过指针传递某些内容,不是由其类型决定的。参数传递和赋值始终是明确的。

答案 4 :(得分:1)

不,不存在这种类型。

而且(部分)原因是它在C ++中没有意义。在C ++中,无论对象是通过值还是引用传递都会产生很大的不同,因此函数需要才能知道它的参数是如何传递的。

在你的代码片段中,当实现第一个函数时,我们知道我们在调用函数时给出了两个引用:因此我们对这些对象所做的任何修改都将对调用者可见。

在第二个函数中,我们知道我们按值给出了两个对象,这意味着我们可以自由地修改它们,并且它们的析构函数将在函数的末尾被调用。

如果有一个偷偷摸摸的类型破坏了这个保证,并且结果是无论如何,我们可以使我们的代码以各种新的和令人兴奋的方式爆炸。

采用这样的简单模板函数:

template <typename T>
T make_default() { return T(); }

如果T是一个假设的“引用类型”,那么这将是未定义的行为:它将创建一个本地实例,然后返回引用。刚刚超出范围的对象的引用,在函数返回时被删除。

除非你有垃圾收集器并丢弃确定性破坏,否则这些引用类型实际上并不能很好地工作,这是一个非常重要的C ++特性。

在C ++中,所有权很重要。为了编写正确的代码,我需要知道谁拥有每个对象。它何时被创建,何时被销毁?引用不会将它指向的对象保持活动状态,因此如果您不小心,它最终可能会指向不再存在的对象,如上面的小模板示例所示。我们需要知道我们正在使用的对象是否是参考。