c++ std::string 을 파라메터로 사용할 때 &를 붙이는 경우와 안붙이는 경우 차이점

keeproll의 이미지

안녕하세요?

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 메세지의 정확한 의미를 설명해주실 분 계신가요...

일단 해결은 &를 제거하고 파라미터로 넘기니 되는것 같은데.....
제가 알고 싶은건 정확한 의미 입니다....

꼭 이해하고 싶네요! 부탁드립니다.

===================================================

추가로 ....
근본적으로 왜 파라미터를 & 로 넘기는지에 대해 물어봤어요...
&는 주소를 받아서 해당 변수의 값을 직접 수정할 수 있도록 하기 위해서 많이 사용되는데....

그런 의미의 사용이기 보다는
& 없이 파라미터로 받으면 내부적으로 한번의 변수 복제가 이루어 지기 때문에
속도 + 메모리 의 낭비라고 하네요...

물론 그렇긴 하지만, 어차피 리턴되면 소멸되는 지역변수인데
정말 속도 + 메모리를 따질 만큼 큰 영향을 미치나요?

keeproll의 이미지

제가 원하던 설명을 시원하게 해준 곳이 있네요.....

http://www.gpgstudy.com/forum/viewtopic.php?p=17906

그렇다면;;;
Warning 이니까 그냥 무시하고 빌드했을 때.......
이런게 문제가 생길 수 있을까요???

일단 MSVC++에서는 Error가 아닌 Warning이니 그냥 빌드는 되는데...

실행파일이 죽을 수 있을까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.