저는 C ++로 코딩하고 있습니다. 함수가 void foo(vector<int> test)
있고 프로그램에서 호출하면 벡터가 값이나 참조로 전달됩니까? 벡터와 배열이 비슷하고 함수 void bar(int test[])
가 값 대신 참조 (포인터?)로 테스트를 통과 한다는 것을 알고 있기 때문에 확실하지 않습니다 . 내 생각 엔 값으로 전달하지 않으려면 포인터 / 참조로 벡터를 명시 적으로 전달해야하지만 확실하지 않습니다.
저는 C ++로 코딩하고 있습니다. 함수가 void foo(vector<int> test)
있고 프로그램에서 호출하면 벡터가 값이나 참조로 전달됩니까? 벡터와 배열이 비슷하고 함수 void bar(int test[])
가 값 대신 참조 (포인터?)로 테스트를 통과 한다는 것을 알고 있기 때문에 확실하지 않습니다 . 내 생각 엔 값으로 전달하지 않으려면 포인터 / 참조로 벡터를 명시 적으로 전달해야하지만 확실하지 않습니다.
답변:
내가 추측해야한다면 Java 배경 출신이라고 말하고 싶습니다. 이것은 C ++이며 &
-operator를 사용하여 달리 지정하지 않는 한 값으로 전달됩니다 (이 연산자는 'address-of'연산자로도 사용되지만 다른 컨텍스트에서 사용됨). 이것은 모두 잘 문서화되어 있지만 어쨌든 다시 반복하겠습니다.
void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference
벡터 ( void foo(vector<int> *bar)
)에 대한 포인터를 전달하도록 선택할 수도 있지만 수행중인 작업을 알 수없고 이것이 정말로 갈 길이라고 생각하지 않는 한이 작업을 수행하지 마십시오.
또한 벡터는 배열과 동일 하지 않습니다 ! 내부적으로 벡터는 메모리 관리를 처리하는 배열을 추적하지만 다른 많은 STL 컨테이너도 마찬가지입니다. 포인터 또는 배열을 기대하는 함수에 벡터를 전달할 수 없으며 그 반대의 경우도 마찬가지입니다 (기본 배열에 액세스 (포인터)하여 사용할 수 있음). 벡터는 멤버 함수를 통해 많은 기능을 제공하는 클래스 인 반면 포인터와 배열은 내장 유형입니다. 또한 벡터는 동적으로 할당되며 (즉, 런타임에 크기가 결정되고 변경 될 수 있음) C 스타일 배열은 정적으로 할당되며 (크기는 일정하며 컴파일 타임에 알려야 함) 사용을 제한합니다.
일반적으로 C ++ (특히 array decay ) 에 대해 좀 더 읽어 보고 배열과 포인터의 차이점을 보여주는 다음 프로그램을 살펴 보는 것이 좋습니다.
void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }
int main()
{
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
foo1(arr);
foo2(arr);
foo3(arr);
foo4(arr);
}
A vector
는 배열과 기능적으로 동일합니다. 그러나 언어 vector
는 유형 int
이며 또한 유형입니다. 함수 인수에 대해 모든 유형 (포함 vector[]
) 의 배열은 포인터로 처리됩니다. A vector<int>
는 int[]
컴파일러 와 동일하지 않습니다 . vector<int>
비 배열, 비 참조, 비 포인터-값으로 전달되고 있으므로 copy-constructor를 호출합니다.
따라서 참조로 전달 하려면 vector<int>&
( const
함수가 수정하지 않는 경우 가급적으로와 함께 ) 사용해야합니다.