본문 바로가기
프로그래밍 언어/C++

[C++] return by reference

by 까망 하르방 2025. 2. 15.
반응형

return by reference 필요성

return by value 방식으로 반환 시
객체 복사본을 생성한다.
정확히는 "리턴용 임시객체(temporary)" 생성되어 반환

 

 

[예시] return by value

struct Point
{
	int x;
	int y;
};

Point pt = { 1, 2 };

Point f()  // return by value
{
	return pt;
}

int main()
{
	f1().x = 10; // error (리턴용임시객체.x = 10)
}

 

 

임시 객체는 함수 호출하는 문장 끝에서 파괴되고
rvalue 활용할 수 없다.
그렇기에 등호(=) 왼쪽으로 올 수 없다.

 


[예시] return by reference

struct Point
{
	int x;
	int y;
};

Point pt = { 1, 2 };

Point& f() // return by reference
{
	return pt;
}

int main()
{
	f().x = 10; // ok
}

생성자/소멸자

[예시] return by value 생성자/소멸자

#include <iostream>

struct Point
{
	int x;
	int y;

	Point(int a, int b) : x{ a }, y{ b } { std::cout << "Point(int, int)" << std::endl; }
	Point(const Point& p) : x{ p.x }, y{ p.y } { std::cout << "Point(Point)" << std::endl; }
	~Point() { std::cout << "~Point()" << std::endl; }
};

Point pt = { 1, 2 }; // 전역 변수

Point f() // return by value
{
	return pt;
}

int main()
{
	std::cout << "----------" << std::endl;
	f();
	std::cout << "----------" << std::endl;
}

 

 

전역 변수 만들데 Point 객체가 만들어지고
중간에 임시 객체가 생성/소멸 되는 것을 확인할 수 있다.

 

 

[예시] return by reference 생성자/소멸자

#include <iostream>

struct Point
{
	int x;
	int y;

	Point(int a, int b) : x{ a }, y{ b } { std::cout << "Point(int, int)" << std::endl; }
	Point(const Point& p) : x{ p.x }, y{ p.y } { std::cout << "Point(Point)" << std::endl; }
	~Point() { std::cout << "~Point()" << std::endl; }
};

Point pt = { 1, 2 }; // 전역 변수

Point &f() // return by reference
{
	return pt;
}

int main()
{
	std::cout << "----------" << std::endl;
	f();
	std::cout << "----------" << std::endl;
}

 

 

return by reference 방식에서는
중간에 임시 객체사 생성/소멸 되지 않는 것을 확인할 수 있다.


return by reference 주의사항

return by reference 에서는

지역 변수로 만들어진 객체는 참조 반환하면 안된다.

 

왜냐하면 지역변수는 함수가 끝나면 파괴되기 때문에

파괴된 함수를 반환하게 되어 버린다.

// 아래 형태는 사용 X
Point& f()
{
	Point p = { 0, 0 }; // 지역 변수
	return p;
}

 

 

컴파일 Error 는 발생하지만
warning 발생하는 것을 확인할 수 있는데
이러한 형태에 주의해야 한다.


[예제] return by value

#include <iostream>

using namespace std;

class Counter
{
	int count = 0;
public:
	Counter inc() // return by value
	{
		++count;
		return *this;
	}
	int get() { return count; }
};

int main()
{
	Counter c;

	c.inc().inc().inc();

	cout << c.get() << endl; // 1
}

 

 

c.inc().inc().inc(); 에서

처음 c.inc() 에서는 c 객체 count 값이 +1 되었지만

이후에는 임시 객체들로 생성/반환되어 "++count" → "++count" 되었지만

임시 객체는 소멸되어 버렸다.

결과적으로 c 객체는 한번만 ++count 되어버린 셈

 

 

[예제] return by reference

count 값이 사용자 의도대로 inc() 되는 것을 확인할 수 있다.

#include <iostream>

using namespace std;

class Counter
{
	int count = 0;
public:
	Counter& inc() // return by reference
	{
		++count;
		return *this;
	}
	int get() { return count; }
};

int main()
{
	Counter c;

	c.inc().inc().inc();

	cout << c.get() << endl;
}

 

 

📌 [C++] 레퍼런스 Reference

 

[C++] 레퍼런스 Reference

레퍼런스 (reference, 참조)이미 존재하는 변수에 추가적인 별칭 부여#include int main(){ int n = 10; int& r = n; r = 20; // 값 변경 std::cout   C 언어에서는 void swap(int* p1, int* p2) 와 같이call by pointer 방식을 사

zoosso.tistory.com

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C++] mutable 키워드  (1) 2025.02.21
[C++] 상수 멤버함수 const member function  (5) 2025.02.19
[C++] class this 키워드  (8) 2025.02.08
[C++] static 변수 필요성 및 활용  (5) 2025.02.06
[C++] default 생성자 요청  (2) 2025.02.05

댓글