C++;? 我理解,与C++(类通过引用传递,结构默认通过)不同,C++中的结构和类都是通过值传递到方法中的,除非它被显式修改为通过引用。
i、 eC++;? 我理解,与C++(类通过引用传递,结构默认通过)不同,C++中的结构和类都是通过值传递到方法中的,除非它被显式修改为通过引用。,c++,C++,i、 e 我的问题是,没有数据结构,C++中的数据类型通过引用传递到方法中吗?无论我使用的是std::list,std::list::iterator,std::map,还是我创建的任何数据类型,无论是结构还是类,都是按引用传递的?没有默认的按引用传递类型。当然,有些引用是通过值传递的(最明显的是,智能指针),这两者之间的差异可以争论一会儿 我并不认为这很重要。添加AN&几乎不是困难或浪费时间的缩影。默认情况下,< P> >所有C++参数都是按值传递的。使用&指示引用。C++具有不同的参数传递和
我的问题是,没有数据结构,C++中的数据类型通过引用传递到方法中吗?无论我使用的是
std::list
,std::list::iterator
,std::map
,还是我创建的任何数据类型,无论是结构还是类,都是按引用传递的?没有默认的按引用传递类型。当然,有些引用是通过值传递的(最明显的是,智能指针),这两者之间的差异可以争论一会儿
我并不认为这很重要。添加AN&几乎不是困难或浪费时间的缩影。默认情况下,< P> >所有C++参数都是按值传递的。使用
&
指示引用。C++具有不同的参数传递和赋值语义。某事物是通过值、引用还是指针传递,并不取决于它的类型。参数传递和赋值总是显式的。最接近您想要的不是通过引用传递,而是使用指针
<>爪哇和C的引用与C++引用的关系更为密切:C++中的引用是对象的别名,相当于C++中的“代码> > REF< /CUD>关键字,而C/J/java中的引用是指指向实际实例(作为C/C++中的指针)的实体。
以下两个是等效的(假设C#中的结构类型):
现在,对于引用类型,等效值为:
void foo( type* param ); // c++
void foo( type param ); // c#
<> P>不同的是C++中指针不是自动撤销的,即必须使用<代码>运算符> <代码>代替<代码> .<代码>访问成员。 < P>,不存在这种类型。 原因是它在C++中是没有意义的。在C++中,对象是否通过值或引用传递很大的差异,因此函数需要知道它的参数是如何传递的。 在您的代码片段中,当实现第一个函数时,我们知道调用该函数时会得到两个引用:因此我们对这些对象所做的任何修改都将对调用方可见 在第二个函数中,我们知道我们被赋予了两个对象的值,这意味着我们可以自由地修改它们,并且它们的析构函数将在函数末尾被调用 如果有一个鬼鬼祟祟的类型打破了这个保证,并最终成为一个参考,我们可以让我们的代码以各种新的和令人兴奋的方式爆炸 以下面这样一个简单的模板函数为例:
template <typename T>
T make_default() { return T(); }
模板
T make_default(){return T();}
如果T
是这样一种假设的“引用类型”,那么这将是未定义的行为:它将创建一个本地实例,然后返回对它的引用。对刚超出范围并在函数返回时被删除的对象的引用
这种引用类型不太好用,除非你有一个垃圾回收器,扔掉确定性破坏,这是一个相当重要的C++特性。
在C++中,所有权是重要的。为了编写正确的代码,我需要知道谁拥有每个对象。什么时候创造,什么时候毁灭?引用不会使它指向的对象保持活动状态,因此如果您不小心,它可能最终指向一个不再存在的对象,如上面的小模板示例所示。我们需要知道我们正在处理的对象是否是引用。迭代器怎么样?我想,
iterator
已经是一个指针了,所以只需要编写voidPassByReference(List::iterator iterator)
?@Graviton:iterator仍然是按值传递的-即使该值是指针。@Graviton:另外,不要混淆:迭代器不是指针,它们的设计使得它们的使用与指针的使用密切相关(您可以执行基本的算术运算——取决于迭代器的类型,您可以取消引用以分配或读取…),但在大多数情况下,实际实现是不同的。特别是std::list::iterator
在符合标准的实现中永远不能是指针(而std::vector::iterator
在某些实现中可以是指针),请记住,默认情况下,C按值传递引用(对于类)。将C++引用与C语言>代码> REF和void foo( type* param ); // c++
void foo( type param ); // c#
template <typename T>
T make_default() { return T(); }