2017-02-27 3 views
1

ではなく、がC++で値渡しのパラメータを受け入れる方法を定義して宣言します。引数は値で渡されswap(a, b)ラインでC++:値によって渡されるパラメータを受け入れることができないように関数を実行する

#include <iostream> 
using namespace std; 

// function declaration 
void swap(int &x, int &y); 

int main() { 
    // local variable declaration: 
    int a = 100; 
    int b = 200; 

    cout << "Before swap, value of a :" << a << endl; 
    cout << "Before swap, value of b :" << b << endl; 


    swap(a, b); //This call MUST NOT be valid. 


    int &x = a; 
    int &y = b; 
    swap(x,y); // This one should be valid. 

    cout << "After swap, value of a :" << a << endl; 
    cout << "After swap, value of b :" << b << endl; 

    return 0; 
} 

void swap(int &x, int &y) { 
    int temp; 
    temp = x; /* save the value at address x */ 
    x = y; /* put y into x */ 
    y = temp; /* put x into y */ 

    return; 
} 

:次のような はエラーを返す必要があります。私はこのようにしてエラーを返すようにしたい。

更新

私はインタビューで、この質問をしました。値で呼び出されたときにエラーを返すメソッドを定義する。

上記のようにswapメインの関数呼び出しabは参考にする必要があります。

+4

関数がその引数を値で受け入れないと宣言することによって?あなたは詳細を教えていただけますか?解決したい実際の問題は何ですか?あなたのユースケースは何ですか?あなたはこれで何を達成しようとしていますか?これまでに何を試みましたか?そして、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)に時間を割けてください。 –

+1

参照によって渡されるパラメータには、「&」(参照による呼び出しを示す)が付いた「マーク付き」です。それはあなたが探しているものではありませんか? –

+3

"in line swap(a、b)引数は値渡しされます。ええええええええと、彼らはありませんか? –

答えて

3

int a{}; 
int& b{a}; 

、あなたは

foo(a); 

は/作品をコンパイルしない。

foo(b); 

がコンパイル可能な方法で機能fooを宣言または定義することはできませんしましょう

fooが、その後aオブジェクトへの参照cを結合するコンパイラをfoo呼び出し時にfoo(int& c)のように宣言されている場合は - 参照cは、任意の非const、不揮発性左辺値にバインドすることができますので、あなたがabを通過したかどうかに関係なく、タイプintと入力します。彼らは「という別名」へのほんのいくつかの種類です:abの両方の範囲内

はそれが約参照が何であるかだからCの点から++ fooへの呼び出しに差があってはならない左辺値です元のオブジェクト

関数swap(int&, int&)を定義すると、すでに「値による呼び出し」が防止されます。 「値による呼び出し」と「参照による呼び出し」という用語は、渡されたオブジェクトではなく、関数のパラメータのプロパティを指します。

関連する問題