2014-02-26 3 views
0

문자열을 메서드의 매개 변수로 사용하면 함수 내의 문자열에 대한 변경 내용이 호출 함수에 반영되지 않습니다. 단순한 이유 값으로 전달.메서드의 매개 변수로 문자열과 벡터의 차이

그러나 사용은 벡터는 벡터에 대한 변경 사항은 다시 호출하는 함수에 반영 될 때. 우리는 메모리가 아닌 변수에 주소를 보내는 기준에 의해 호출과 같은 기능 내에서 따라서 변경이 기능

를 호출에 다시 반영 재 그래서 여기 벡터를 통과 않는 내 질문입니다 --------- --------------- 업데이트 --------------------------------

벡터는 참조 용으로 만 전달되어야합니까? 나는 정상적으로 그것을 할 수 없다?

물론 정상적으로 전달할 수 있습니다 (값으로 전달). 그러나 객체를 값으로 전달할 때 새로운 객체가 만들어지고 전달 된 객체가 새 객체에 복사된다는 것입니다. 표준 타입은 크기가 작기 때문에 (char는 1 바이트, short는 2, int는 2 또는 4, long은 4 등) 표준 타입 (char, int, float 등)에 대해서는 ok입니다. 그러나 벡터는 그다지 작지는 않습니다. 다음과 같이 시도하십시오.

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector<int> v; 
    cout << sizeof(v) << endl; 

    system("pause"); 
    return 0; 
} 

내 PC에 출력 12 개가 있습니다. 12 바이트입니다. 그래서 대신에 값으로 전달하는, 나는 4 바이트의 비용

+0

아니요, Java의 모든 요소는 값으로 전달됩니다. 우리는 당신이 논쟁으로 무엇을하는지 알아야 할 것입니다. 매개 변수 변수를 다시 할당하는 것은 호출 코드의 인수에 반영되지 않습니다. –

+1

이것은 C++ 질문일까요? – ajb

답변

5

그러나 벡터를 사용하면 벡터 변경 내용이 호출 함수에 반영됩니다.

이 때문에 참조로 전달하는 것이다. 참조로 std::string을 전달하면 동일한 효과가 나타납니다.

역뿐만 아니라 사실이다 : 당신은 매개 변수 선언에서 앰퍼샌드를 생략하는 경우 값에 의해 std::vector를 전달할 수 있습니다. 그러나 벡터의 전체 내용이 복사되므로 비용이 많이 듭니다.

벡터는 참조에 의해 전달되는 그래서?

참조로 전달할 필요는 없지만 값으로 전달하는 것은 너무 비싸서 많은 사람들이이를 수행 할 수 있습니다. sizeof(v)에 관한 한, 벡터 객체 (이 경우에는 스택에 있음)가 할당 된 벡터의 크기가 작습니다. sizeof 연산자에 의해 설명되지 않는 벡터 내부의 포인터가 가리키는 동적 부분도 있습니다.

+0

+1, "그들은 (표준 : 벡터)를 참조로 전달할 필요는 없지만 많은 경우 값으로 전달하는 것은 단순히 너무 비쌉니다"특히. 벡터가 있고이를 사용할 수있는 객체가 필요한 경우 일반적으로 벡터를 한 번만 참조로 전달하고 핸들을 유지합니다. 드문 경우이긴하지만, 아마도 50MB가 될 수있는 무언가를 복사하지 않기 때문에 아마 값으로 전달하는 것을 피할 것입니다. –

1

내가 문자열 특별한 것을 지적하는 시간을 가져 가고 싶어 (내 벡터의 주소가 들어있는 변수의 크기)가 참조로 전달할 케이스. String는 변경 불가능한 최종 클래스이며 수정할 수 없습니다.

+0

'최종'사실로 변경되지 않습니다. –

+0

'final'은'extends String' 클래스를 선언 할 수 없다는 것을 의미합니다. 다른 것들은 그것을 불변으로 만든다. – ajb

1

이 정말 자바 질문을한다 가정하면

이 모두 StringVector 유형 값에 의해 전달 (그러나 전달 된 값이 실제로 참조입니다)된다. 고려 : 경우 영향을받는 발신자의 매개 변수가

void foo1 (String s) { 
    s = new String("abcde"); 
} 

void foo2 (Vector<Integer> v) { 
    v = new Vector<Integer>(); 
} 

에서 어느.이 두 가지 모두 전달 된 개체 참조의 로컬 복사본을 수정하지만 참조 된 개체에는 아무 것도 수행하지 않습니다.

당신이 생각 벡터를 수정 뭔가 할 경우

void foo3 (Vector<Integer> v) { 
    v.add (10); 
} 

이 개체가 수정을 v 점에 그. 이 같은 String을 수정하는 방법이 있다면 :

void foo4 (String s) { 
    s.setChar(0, '!'); // does not exist in Java 
     // but pretend that it changes the first character of the string 
} 

은 그 또한 발신자가 foo4에 전달하는 개체를 수정합니다. 하지만 String 개체는 Java에서 불변이므로이 예제를 실제로 줄 수는 없습니다.

+1

@SotiriosDelimanolis 내 벙어리 오류 잡기에 감사드립니다 ... – ajb

관련 문제