2016-02-19 56 views
2

在C++中,所有类型都是按值传递的,除非它带有&*符号?默认情况下,C++中的所有东西都是按值传递的

例如在Java中,将数组作为函数参数传递将默认按引用传递。 C++能让你更好地控制它吗?

编辑:感谢您的所有回应,我想我更清楚地了解整个传递价值的事情。对于任何人谁是仍然感到困惑关于Java如何经过值(对象引用的副本),this answer really cleared it up for me.

+0

即使在java中,对象也是按值传递的。理想情况下,将对象视为通过引用传递会使其更易于理解,这可能是某些书籍和引用将“传递对象”称为“通过引用传递”的原因。 Java遵循按值传递,并且没有任何东西像“传递参考”。 –

+0

在传递数组的情况下,C++提供了vector作为另一个选项。我只是把这个问题放在错误的地方,给所有的选民。 – WhatsUp

+0

当比较两种语言以及它们如何处理参数时,我会避免说像“value”和“reference”这样的术语。 C++的这些术语意味着特定的事情。 Java的这些术语意味着特定的事情。对于另一种语言,又是具体的事情。 – PaulMcKenzie

回答

7

在C++中,是按值传递的所有类型,除非它带有一个&或* 符号?

不,如果您传递*参数(其指针),它仍然通过。传递指针的副本。但是原件和拷贝都指向相同的内存。它在C#中是类似的概念 - 我相信也在Java中,只是你不使用*。

这就是为什么如果您使用此指针(例如,使用解除引用)更改外部对象,则更改也会在原始对象中可见。

但是,如果你只是说分配一个新的值的指针,什么都不会发生在外部对象。例如

void foo(int* ptr) 
{ 
    // ... 
    // Below, nothing happens to original object to which ptr was 
    // pointing, before function call, just ptr - the copy of original pointer - 
    // now points to a different object 
    ptr = &someObj; 
    // ... 
} 

例如在Java中,传递数组作为函数参数将是 默认传递通过引用。 C++是否可以让你更好地控制这个 ?

在C++或C如果传递阵列(例如int arr[]),什么被传递被视为指针数组的第一个元素。因此,我在上面所说的也是如此。

约&你是对的。您甚至可以将&应用于指针(例如,int *&),在这种情况下,指针确实通过引用传递 - 没有复制。

+0

'实际上被传递的东西被视为指针'这也适用于java。 Java也没有像传递引用一样。 –

+0

@MathewsMathai我正在改变,你可以交叉检查 –

+0

嗯,我只是提到。没有恶意。 –

2

可能与您的问题相切,但我经常采取另一个方向来了解在C++中调用函数时会发生什么。

void foo(Bar bar); // [1] 
void foo(Bar& bar); // [2] 
void foo(Bar* bar); // [3] 

之间的区别是,在[1]身体会收到原始条的副本(我们的价值称之为,但我更愿意把它看作我自己复制)。

[2]的主体将使用完全相同的bar对象;没有副本。我们是否可以修改bar对象取决于参数是否为Bar& bar(如图所示)或const Bar& bar。请注意,在格式良好的程序中,[2]将始终收到一个对象(不包括null引用;让我们暂时搁置悬挂的引用)。

[3]的主体将收到指向原始bar的指针的副本。我是否可以修改指针和/或被指向的对象取决于参数是const Bar* bar,const Bar* const barBar* const barBar* bar(是,真的)。指针可能是也可能不是null

我做这种心理区别的原因是因为该对象的副本可能有也可能没有引用语义。例如:这个类的一个实例的副本:

struct Foo { 
std::shared_ptr<FooImpl> m_pimpl; 
}; 

会,默认情况下,具有相同的“内容”作为原始(一个新的共享指针指向同一FooImpl指针)。这当然取决于程序员如何设计课程。

因此,我更喜欢将[1]想象为“获取一份酒吧的副本”,如果我需要知道这样的副本是否是我想要的以及我需要的,我就直接去了解该课程,以了解什么请问该类特别是指拷贝

相关问题