Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;? 我理解,与C++(类通过引用传递,结构默认通过)不同,C++中的结构和类都是通过值传递到方法中的,除非它被显式修改为通过引用。_C++ - Fatal编程技术网

C++;? 我理解,与C++(类通过引用传递,结构默认通过)不同,C++中的结构和类都是通过值传递到方法中的,除非它被显式修改为通过引用。

C++;? 我理解,与C++(类通过引用传递,结构默认通过)不同,C++中的结构和类都是通过值传递到方法中的,除非它被显式修改为通过引用。,c++,C++,i、 e 我的问题是,没有数据结构,C++中的数据类型通过引用传递到方法中吗?无论我使用的是std::list,std::list::iterator,std::map,还是我创建的任何数据类型,无论是结构还是类,都是按引用传递的?没有默认的按引用传递类型。当然,有些引用是通过值传递的(最明显的是,智能指针),这两者之间的差异可以争论一会儿 我并不认为这很重要。添加AN&几乎不是困难或浪费时间的缩影。默认情况下,< P> >所有C++参数都是按值传递的。使用&指示引用。C++具有不同的参数传递和

i、 e


我的问题是,没有数据结构,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
已经是一个指针了,所以只需要编写void
PassByReference(List::iterator iterator)
?@Graviton:iterator仍然是按值传递的-即使该值是指针。@Graviton:另外,不要混淆:迭代器不是指针,它们的设计使得它们的使用与指针的使用密切相关(您可以执行基本的算术运算——取决于迭代器的类型,您可以取消引用以分配或读取…),但在大多数情况下,实际实现是不同的。特别是
std::list::iterator
在符合标准的实现中永远不能是指针(而
std::vector::iterator
在某些实现中可以是指针),请记住,默认情况下,C按值传递引用(对于类)。将C++引用与C语言>代码> REF和 Out/<代码>参数进行比较,对C++“引用”(C++类中的C类,而不是结构类)的C++指针进行比较,请记住C++没有区分“类”和“结构”(两个关键字都声明类)。除了一个次要的实现细节:默认访问成员和基。我甚至不确定这意味着什么,所以很难不同意。就C++而言,所有变量(无论是全局变量还是局部函数)都可以在<代码> MaloC < /Cord> ED内存中,而不是数据段;无论如何,你也说不出来。否决了这个答案,因为首先,提问者清楚地知道如何引用,其次,这个问题肯定没有问如何引用。
void foo( type* param );     // c++
void foo( type param );      // c#
template <typename T>
T make_default() { return T(); }