2025. 3. 15. 17:50ㆍ개발자 능력치 물약/C++
템플릿은 인스턴스화 전까지 컴파일시 아무런 코드로 변환되지 않는다
static 멤버 변수: 프로그램이 종료될때 사라짐, 모든객체들이 공유하는 변수
const static 이 아니면 외부에서 선언, 선언시 0으로 초기화
static으로 선언한 함수: 클래스::함수명 으로 호출, 함수내에서는 static으로 선언한 변수만 사용가능
초기화 리스트 : 생성자() : 변수(값), ... { }
mutable : const 함수 안에서 변수를 수정하기 위해 씀
explicit: 명시적 형변환, 컴파일러가 마음대로 형변환해서 오류가 생기는걸 방지하기 위해 씀
c++에는 static_cast, dynamic_cast 같은 발전된 형변환 기능이 있다.
static cast는 컴파일 타임에 형변환 오류를 잡아줌
dynamic_cast는 상속관계에서 클래스의 포인터나 레퍼런스를 안전하게 변환하기 위해 사용한다.
Lvalue 와 Rvalue
// 좌측값들
//
int i = 42;
i = 43; // ok, i 는 좌측값
int* p = &i; //&i 를 쓸 수 있다.
int& foo(); // int& 을 리턴하는 함수
foo() = 42; // ok, foo() 는 좌측값
int* p1 = &foo(); // ok, &foo() 를 할 수 있다.
// 우측값들
//
int foobar(); // int 를 리턴하는 함수
int j = 0;
j = foobar(); // ok. foobar() 는 우측값이다
int* p2 = &foobar(); // error. 우측값의 주소는 참조할 수 없다.
j = 42; // 42 는 우측값이다.
Lvalue는 메모리상에 주소를 가지는 식(expression)
Rvalue는 주소를 가지지않는 임시 객체 (리터럴, 연산결과, 변수..)
C++에서 함수호출식의 R/Lvalue 여부는 반환타입에 결정된다.
int& foo()는 int 레퍼런스 타입을 반환하므로
foo()를 Lvalue로 사용할 수 있다. { foo()가 x라는 변수를 리턴하는 기능을 가진 함수면 &x 를 반환하므로}
함수가 참조자를 반환하여 Lvalue를 돌려주는 능력은 연산자 오버로딩에서도 볼 수 있다.
연산자 오버로딩
std::map::operator[] 연산자
맵 요소에대한 레퍼런스를 반환하므로
mymap[key] =value; 처럼 대입연산자로 값을 할당하는 것이 가능하다.
int foobar(); 는 왜 Rvalue일까
함수가 반환하는 값은 임시로 생성된 복사본 또는 임시 객체이다.
특정 메모리 주소를 갖는 이름있는 객체가 아니기 때문이다.
다시 말해, 참조를 통한 별칭이 아니라 새로운 값을 복사(혹은 move)해서 돌려주므로
이 함수 호출 결과는 일종의 임시(Rvalue) 객체로 간주됨
int* p2 = &foobar(); 가 안되는 이유도
foobar()는 임시객체이므로 특정 메모리 주소를 가지고 있지 않아서 참조가 불가능하다.
이런 임시객체 관련된 문제를 해결하기 위해 Rvalue참조 (&&)라는 개념이나
std::move라는 야무진 연산이 등장했다.
씹어먹는 C++ - <2. C++ 참조자(레퍼런스)의 도입>
모두의 코드 씹어먹는 C++ - <2. C++ 참조자(레퍼런스)의 도입> 작성일 : 2012-01-01 이 글은 133772 번 읽혔습니다. 안녕하세요 여러분! 오랜만에 찾아온 Psi 입니다. 사실 이전 강좌에서 부터 강조해왔지
modoocode.com
씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해
함수의 오버로딩에서 void foo(X& x); 는 좌측값 참조 오버로딩, void foo(X&& x); 은 우측값 참조 오버로딩 여러분은 이를 통해 foo 가 좌측값에, 혹은 우측값에 호출됨에 따라서 상황을 적절하게 처리할
modoocode.com
'개발자 능력치 물약 > C++' 카테고리의 다른 글
SOLID 원칙 (0) | 2025.03.24 |
---|---|
백준 14490 백대열: 문자열파싱/ 최대공약수 구하기 (0) | 2025.03.17 |
인라인 함수와 매크로의 차이 (0) | 2025.03.10 |
프로그래머스 레벨0: 두 수의 연산값 비교하기 (0) | 2025.02.23 |
프로그래머스 레벨 0: 더 크게 합치기 (0) | 2025.02.23 |