10월, 2022의 게시물 표시
{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[C++] The C++ Programming Language: 7. Pointers, Arrays, and References (3) - Rvalue References, References to References

 7.7.2 Rvalue References   한 종류 이상의 참조들에 대한 기본적인 아이디어는 서로 다른 객체의 사용법들을 지원하기 위함입니다. non-const lvalue 참조는 객체를 참조하며, 객체는 사용자가 작성할 수 있는 것입니다. const lvalue 참조는 상수를 참조하며, 상수는 참조의 사용자 관점에서 불변한 것입니다. rvalue 참조는 임시 객체를 참조하며, 이는 참조의 사용자가 다시는 사용하지 않을 것이라고 생각하고, (일반적으로)변경할 수 있는 객체를 참조하는 것입니다.   우리는 참조가 정말 임시로 참조하는지를 알고 싶습니다. 만약 그렇다면, 때때로 비용이 비싼 복사 연산 대신 저렴한 이동 연산으로 전환할 수 있을 것이기 때문이죠. 잠재적으로 엄청난 양의 정보를 가리키는(pointing) 작은 기술자(descriptor)에 의해 제공되는 객체는, 만약 그것이 더이상 사용되지 않을 것을 안다면 단순하고 저렴하게 이동될 수 있을 것입니다. 전형적인 예로 반환 값을 들 수 있습니다. 반환되는 지역 변수는 결코 다시 사용되지 않을 것임을 컴파일러가 알기 때문이죠.   rvalue 참조는 rvalue에 바인딩 될 수 있으나, lvalue에는 될 수 없습니다. 따라서, rvalue 참조는 lvalue 참조의 정반대에 있는 것입니다: 1 2 3 4 5 6 7 8 9 10 11 12 string  var  { "Cambridge" } ; string  f( ) ; string &  r1  {var} ;   // lvalue reference, bind r1 to var (an lvalue) string &  r2  {f( ) } ;   // lvalue reference, error : f() is an rvalue string &  r3  { "Princeton" } ;   // lvalue reference, error : cannot bind to temporary string &a

[C++] The C++ Programming Language: 7. Pointers, Arrays, and References (2) - Lvalue References

이미지
 7.7 References   포인터는 우리가 잠재적으로 많은 양의 데이터를 적은 비용으로 다룰 수 있도록 해줍니다. 데이터를 복사하는 것 대신, 단순히 포인터의 값으로 주소를 전달하면 되기 때문이죠. 포인터의 타입은 포인터를 통해 데이터에게 무엇을 할 수 있는지를 결정합니다. 객체의 이름 대신 포인터를 사용하는 데에는 몇 가지 차이가 있습니다: 다른 문법을 사용합니다. obj 대신 *p를, obj.m 대신 p->m을 사용합니다. 서로 다른 시기에 서로 다른 객체를 참조하는 포인터를 만들 수 있습니다. 객체를 직접 사용할 때 보다 포인터를 활용할 때 더욱 주의를 기울여야 합니다: 포인터는 nullptr일 수 있으며 예상치 못한 객체를 가리키고 있을 수 있습니다.   이러한 차이는 우리를 짜증나게 하죠. 예를 들어, 몇몇 프로그래머는 f(x) 대신 보기 좋지 않은 f(&x)를 볼 수 있습니다. 더욱이, 값이 변하는 포인터 변수를 관리하고 nullptr의 가능성으로부터 보호하는 것은 큰 부담입니다. 마지막으로, 우리가 연산자를 오버로딩하고 싶을 때도 있습니다. &x+&y대신 x+y를 쓰고 싶은 것이죠. 이러한 문제들을 해결하는 언어 메커니즘을 참조(reference)라고 합니다. 포인터와 같이, 참조는 객체의 별명(alias)입니다. 객체의 머신 주소를 이용하는데 구현되죠. 포인터에 비해 추가적인 성능의 오버헤드가 있는 것도 아닙니다. 하지만 포인터와 다른 점이 있죠: 여러분들은 객체의 이름과 똑같은 문법으로 참조를 접근할 수 있습니다. 참조는 항상 초기화될 때 얻은 객체를 참조합니다. "null 참조"라는 것은 없으며, 특정 객체를 가리키는 참조임을 보장할 수 있습니다.   참조는 객체의 대체 이름입니다. 참조의 주된 사용은 일반적인 함수, 특히 연산자를 오버로딩하는 함수의 인자와 반환 값을 명세하는데 사용됩니다: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 templa