c++ std::string 을 파라메터로 사용할 때 &를 붙이는 경우와 안붙이는 경우 차이점
안녕하세요?
C++로 코딩을 시작한지 얼마 안된 초보개발자 입니다.
문자 데이터를 사용할 때 std::string을 이용하여 대부분 처리를 하고 있는데,
함수에서 파라미터로 넘길 때 이해가 가지 않는 부분이 있어 고수분들께 여쭈어봅니다.
클래스 멤버함수로
void Manager(std::string sName, std::string sAddress);
라는 것이 있다고 가정을 하면
c++에서 파라미터 기본값 지정을 할 수 있으니
void Manager(std::string sName, std::string sAddress = "서울");
처럼 사용할 수 있겠지요?
그런데, 저 std::string에 &를 붙이면 Warning이 납니다. 정확하게 Warning이 발생하는 예를 들면
void Manager(std::string sName, std::string& sAddress = std::string("서울"))
이라고 정의된 멤버함수를 호출할 때
Manager(std::string("이름"), std::string("경기도"));
라고 했을때 Warning이 나네요....
대충 생각하기에....바로 std::string("경기도") 라고 생성해서 파라미터로 전달하게 되면
& 는 참조 연산자이니, 변수처럼 참조할 주소가 있어야 하는데, "경기도"라는 문자열만 생성해서 보낸 것이라
참조할 주소가 없다.....
이정도로만 생각했는데요........정확히 이해가 가지 않네요...
구글링을 해보니 &를 붙일 경우 const를 사용해야 한다고 하는 것 같은데.;;;
정확한 Warning 메세지는 아래와 같습니다.
1>..\Manager.cpp(00): warning C4239: 비표준 확장이 사용됨 : '인수' : 'std::basic_string,std::allocator>'에서 'std::string &'(으)로의 변환입니다.
1> 비const 참조는 lvalue에만 바인딩할 수 있습니다.
저 Warning 메세지의 정확한 의미를 설명해주실 분 계신가요...
일단 해결은 &를 제거하고 파라미터로 넘기니 되는것 같은데.....
제가 알고 싶은건 정확한 의미 입니다....
꼭 이해하고 싶네요! 부탁드립니다.
===================================================
추가로 ....
근본적으로 왜 파라미터를 & 로 넘기는지에 대해 물어봤어요...
&는 주소를 받아서 해당 변수의 값을 직접 수정할 수 있도록 하기 위해서 많이 사용되는데....
그런 의미의 사용이기 보다는
& 없이 파라미터로 받으면 내부적으로 한번의 변수 복제가 이루어 지기 때문에
속도 + 메모리 의 낭비라고 하네요...
물론 그렇긴 하지만, 어차피 리턴되면 소멸되는 지역변수인데
정말 속도 + 메모리를 따질 만큼 큰 영향을 미치나요?
자문자답 과 추가 의문사항
제가 원하던 설명을 시원하게 해준 곳이 있네요.....
http://www.gpgstudy.com/forum/viewtopic.php?p=17906
그렇다면;;;
Warning 이니까 그냥 무시하고 빌드했을 때.......
이런게 문제가 생길 수 있을까요???
일단 MSVC++에서는 Error가 아닌 Warning이니 그냥 빌드는 되는데...
실행파일이 죽을 수 있을까요?
댓글 달기