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
레퍼런스 (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 |
댓글