C++ 중급 - 임시객체

타입·2024년 1월 12일
0

C++ 공부

목록 보기
2/17
  • Named Object
    자신을 선언한 블럭을 벗어날 때 파괴
Point pt(1, 2);
  • Unnamed Object
    자신을 선언한 문장의 끝에서 파괴
    임시객체 (Temporary)
Point (1, 2);

Temporary 특징

  • rvalue
Point(1, 2).x = 10; // 컴파일 에러
  • 주소 연산자로 주소를 구할 수 없다
    문장이 끝나고 바로 파괴되기 때문
  • 참조도 불가능
    const 참조는 가능, 수명이 대입한 상수로 연장됨

객체를 함수 인자로만 사용한다면 Temporary로 전달하는게 효율적

void foo(const Point& pt); // 인자는 const 참조로 받아야함

int main()
{
	//	Point pt(1,2); 
	//	foo(pt);

	foo(Point(1, 2)); // foo(Point{1,2});
}

읽기 전용 문자열을 함수 인자로 받는 경우 const std::string& 보다 std::string_view가 좋음

void foo(const std::string& s);
void goo(std::string_view s); // 문자열의 주소와 길이로 접근

int main()
{
	foo("Practive make perfect"); // 문자열의 복사본을 힙에 생성
	goo("Practive make perfect"); // 이미 상수 메모리에 존재하는 문자열을 가리킴
}

return by value와 return by reference

Point pt(1, 2); // 전역변수

Point f3() // return by value 
{
	return pt;
}
Point& f4() // return by reference 
{
	return pt;
}

Point& f5() // 지역변수는 참조 반환 금지 (블럭이 벗어날 때 파괴되므로)
{
	Point pt(1, 2);
	return pt;
}

int main()
{
	f3().x = 10; // Temporary 반환, 컴파일 에러
	f4().x = 10; // 컴파일 성공, pt.x = 10
}

값 캐스팅과 참조 캐스팅

struct Base
{
	int value = 10;

	Base() = default;

	Base(const Base& b) : value(b.value)
	{
		std::cout << "Base copy" << std::endl;
	}
};

struct Derived : public Base
{
	int value = 20;
};

int main()
{
	Derived d;
	std::cout << d.value << std::endl; // 20, Derived의 value를 꺼냄
	std::cout << static_cast<Base&>(d).value << std::endl; // 10, Base의 value를 꺼냄
	std::cout << static_cast<Base>(d).value << std::endl; // 10, Base 타입의 Temporary 생성하며 복사 생성자 호출
    
	static_cast<Base&>(d).value = 100; // lvalue
//	static_cast<Base>(d).value  = 100; // 컴파일 에러, temporary
}
  • temporary가 생성되는 경우
    • 함수 인자로 객체를 전달
    • 함수 인자로 생성자 인자를 전달
    • 함수가 값으로 객체를 반환
    • 객체를 값으로 캐스팅
profile
주니어 언리얼 프로그래머

0개의 댓글