* 과 & 은 Lval Rval 일때 의미가 다르다
Lval | Rval | |
* | 주소값자료형 | 주소가 가리키는 값을 리턴 [ 주소값자료형 변수만 가능 ] |
& | 참조형자료형 (주소값을 참조형으로 래핑해서 저장한다) |
변수 자체의 주소를 리턴 [ 변수 자체의 주소만 안됨 ] |
공통점 | 주소값 Rval가 들어와야함 | |
int bb = 1;
std::cout << bb << std::endl; // 1
std::cout << &bb << std::endl; // 0x7ffc57be8a48
std::cout << *(&bb) << std::endl; // 1
int a = 10;
int* p_b = &a; // a의 주소를 p_a에 할당
std::cout << "----------" << std::endl;
std::cout << p_b << std::endl; // 0x7ffc57be8a4c
std::cout << &(*p_b) << std::endl; // 0x7ffc57be8a4c
std::cout << *(*(&p_b)) << std::endl; // 10
std::cout << *p_b << std::endl; // 10
ex)
Monitor* temp = new Monitor();
Monitor& m1 = *temp;
위의 경우
temp == &m1
(*temp) == (*(&m1))
이다.
(*(&m1)) <- 이거는 m1자료형을 풀고 나온 주소값을 가리켜서 객체 자체가 나온것
오퍼레이터 설명 | |
-> | 주소가 가리키는 객체 |
. | 객체 |
ex)
Monitor* temp = new Monitor();
Monitor& m1 = *temp;
위의 경우
(*(&m1)).test_1();
(&m1)->test_1();
m1.test_1();
(*temp).test_1();
temp->test_1();
전부 같은 함수를 가리킨다.
#include <iostream>
int t1() {
std::cout << "11111111111111111111111111111111111" << std::endl;
return 0;
}
class Monitor
{
public:
explicit Monitor() {
std::cout << "Monitor 생성자 호출" << std::endl;
}
int a=0;
~Monitor() {
std::cout << "Monitor 소멸자 호출" << std::endl;
}
void test_1(){
std::cout << "test_1 " << a << std::endl;
}
private:
void test_2(){
std::cout << "private" << std::endl;
a = 1;
}
public:
void test_3(){
test_2();
}
// << 연산자 오버로딩
friend std::ostream& operator<<(std::ostream& os, const Monitor& m) {
// Monitor 객체의 정보를 os 스트림에 출력하는 코드를 작성합니다.
// 예를 들어:
os << "Monitor 객체 Called : " << &m ;
// os << &Monitor;
return os;
}
};
int main(){
// Monitor *m1 = new Monitor();
//
// // m1을 사용한 작업
// delete m1;
Monitor* temp = new Monitor();
Monitor& m1 = *temp;
std::cout << ":: " << temp << std::endl;
std::cout << ":: " << &m1 << std::endl;
std::cout << ":: " << (*temp) << std::endl;
std::cout << ":: " << (*(&m1)) << std::endl;
// Monitor& m1 = Monitor();
std::cout << m1.a << std::endl;
// 포인터를 통한 멤버 접근 연산자 사용
temp->test_3();
temp->test_1();
// 포인터를 역참조하여 객체에 접근
(*temp).test_3();
(*temp).test_1();
// 참조를 통한 멤버 함수 호출
m1.test_3();
m1.test_1();
// 참조의 주소를 가져와 포인터로 멤버 함수 호출
(&m1)->test_3();
(&m1)->test_1();
// 참조의 주소를 가져와 역참조하여 멤버 함수 호출
(*(&m1)).test_3();
(*(&m1)).test_1();
// m1을 사용한 작업
t1();
}
'언어 정리 > C++_개념_lib' 카테고리의 다른 글
typedef (0) | 2024.01.03 |
---|---|
#if, 초기화리스트, const, namespace (0) | 2024.01.02 |
template 설명 [ fold_expression ] (0) | 2023.12.27 |
가변인자 (1) | 2023.12.27 |
Lvalue , Rvalue , 메모리 누수 (1) | 2023.12.27 |
댓글