c++ 기본서 보다가 참조자가 은근 어려운 스킬이 좀 많아서 후반부로 들어가니깐 좀 골치아픈데요
class Rectangle_1
{
private :
Point UL;
Point DR;
public :
bool InitMembers(Point& ul, Point& dr);
void ShowInfo();
};
class Rectangle_2
{
private :
Point &UL;
Point &DR;
public :
bool InitMembers(Point& ul, Point& dr);
void ShowInfo();
};
[main 함수]
Point pos1 = {10,2};
Point pos2 = {10,2};
Rectangle_1 sample1;
sample1.InitMembers(pos1, pos2);
Rectangle_2 sample2;
sample2.InitMembers(pos1, pos2);
------------------
class Rectangle_1과 class Rectangle_2 차이는 밑 줄 그어진 멤버 변수만 있는데 궁금한건 class Rectangle_1과 class Rectangle_2의 차이점이
class Rectangle_1은 ul, dr은 pos1, pos2와 동일한 주소인데 멤버변수 UL, DR는 주소가 다른거임?
그럼 class Rectangle_1 pos1, pos2와 ul, dr, UL, DR 모두 동일한 주소인가요?
아 은근 헷갈림....
lsp
음 이거 컴파일 안될거 같은뎅
클로로프렌
예시로 만든건데 이론은 맞나요?
lsp
아마 Rectangle2는 레퍼런스니까 동일한 주소고, Rectangle1은 다른 주소일거에요.
제가 알기로 이게 컴파일이 안되는게 레퍼런스로 변수 만들면 생성시 초기화가 필요할듯요.
느그본체만수무강
initializer로 초기값 잡으면 가능하지 않으려나?
lsp
그래서 생성시 초기화 필요하다구 썼음
클로로프렌
헤더파일 글거온거라 이니셜라이저 생략했어요
클로로프렌
ㅇㅇ 참조자면 이니셜라이저로 해야 하는데 헤더 파일에는 이니셜라이저 안 써도 되겠지하거 대충 넘긴거임 ㅇㅇ
LAMP
간단하게 아래 같은 경우를 생각해보면
int a = 0;
int& b = a;
int c = b;
b는 a의 주소를 갖고있고, c는 b 주소에 있는 값을 복사한거임.
b에 값을 대입하면 a가 바뀌고(c는 그대로), c에 값을 대입하면 c만 바뀜.
그러니까 pos1, pos2와 Rectangle_1 의 ul, dr은 주소가 같고, UL, DR 은 주소가 다름.
클로로프렌
흠 쉽게 생각하면 참조자를 사용해서 이미 객체 생성된거를 또 생성되는 걸 방지하는 건가요?
또한 매개변수이 const int &a이거는 상수,변수를 받기 위함이라고 하는데
int &a로 받으면 상수를 못받나요? 이거 좀 어렵네요...
LAMP
InitMembers 함수가 참조변수로 인자를 받는 이유는, 주소를 인자로 전달받는 것의 흔한 이점인 효율적인 메모리 사용을 위한 거라고 생각되네요.
그리고 const int i 라는 변수가 있다면, const int &a = i 는 가능하지만, int &a = i 는 안됩니다. 그냥 문법적인 내용이죠.