Help us understand the problem. What is going on with this article?

"call by reference"ではない動作を「参照渡し」と言っている記事まとめ

C++、C#、PHP等には"call by reference"という機能があります。ですが、この"call by reference"ではない動作を「参照渡し」と言っている記事をまとめました。対象には表記揺れにすぎない「参照呼び」や「参照呼び出し」も含めています。


"call by reference"な動作とは?

定義や詳しい動作の解説はここではしませんが、"call by reference"になっている場合、仮引数そのものへの代入には下記のような副作用が伴います。このような動作になるかどうかで"call by reference"であるかどうかを判断しています。

#include <iostream>
void f(int& x)
    x = 1;
int main()
    int a = 0;
    std::cout << a << std::endl; // 1
    return 0;


以下の記事は"call by reference"ではない動作、ほとんどの場合は"call by value"の一種である"call by address"または"call by sharing"と言われている動作を「参照渡し」と言っています。なお、本来、このような評価戦略の話は関数へ実引数へ渡す時の動作のことを言います。しかし、関数へ実引数を渡すことは、言い換えると、仮引数に実引数を代入(assignment)する事でもあります。よって、通常の代入に対する解説でも、関数への仮引数への代入時と同等の動作の解説として考え、どの評価戦略になるのかを判断しています。

検索の関係上、記事は言語別で、C、JavaScript、Java、Python、Rubyに絞りました。これらの言語には"call by reference"の機能は存在しません。また、スタック・オーバーフローやteratail等のQAサイトは除外しています。




8.4.1. Formal Parameters - Chapter 8. Classes - The Java® Language Specification Java SE 12 Edition より

When the method or constructor is invoked (§15.12), the values of the actual argument expressions initialize newly created parameter variables, each of the declared type, before execution of the body of the method or constructor.


4.6. Defining Functions - 4. More Control Flow Tools — Python 3.7.3 documentation より

The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using call by value (where the value is always an object reference, not the value of the object).


Stack Overflowの回答によると、O'Reilly Media, Inc. The Ruby Programming Language (David Flanagan, Yukihiro Matsumoto著) 3.8.1: Object References より

When you pass an object to a method in Ruby, it is an object reference that is passed to the method. It is not the object itself, and it is not a reference to the reference to the object. Another way to say this is that method arguments are passed by value rather than by reference, but that the values passed are object references.


  1. C++の"call by reference"は「参照渡し」では無いという主張をしている。 

  2. 原文でも"objects and arrays in JavaScript are passed by reference"と書かれているため、誤訳ではありません。 

  3. 修正版では「参照渡し」の表現はありません。 

  4. 原文は確認できませんでしたが、"Peter J. Jones, author of Effective Ruby: 48 Specific Ways to Write Better Ruby, examines all sides of the great 'call-by-value or call-by-reference' argument-passing debate."とあるため、原文でも"call by reference"と言っている可能性が高いです。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away