본문 바로가기
언어 정리/C++_개념_lib

참조와 포인터

by 알 수 없는 사용자 2023. 12. 26.

* 과 & 은 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

댓글