[전공 CS]/자료구조

[자료구조] C++ 기초(2)_ The Big5, call by constant reference

우당탕탕 개발 일지 2024. 5. 17. 21:19

안녕하세요. 우당탕탕 개발일지입니다. 2학년 1학기 데이터 구조론을 듣게 되었습니다. 수업 중 배운 내용을 복습하는 용도입니다. 우당탕탕 파이팅!

 

  • reference 변수
  • call by-
  • The Big 5
  • shallow copy, Deep copy

 

1. reference 변수

reference변수 =주소를 참조하는 변수

참조 기호 : &

 

  • 공간을 공유한다. 복사할 필요가 없다.=> 값이 같이 변함
  •  ⭐reference는 포인터가 아니다. 
  • 매개변수 넘겨줄때 or 지역 변수로 사용한다.
  • &를 쓰려면 오른쪽 값도 l-value 이어야 한다.
//x,y가 같은 공간을 공유한다.= 값이 같이 변한다.
#include <iostream>
using namespace std;

int main()
{

int x=3;
int &y=x;
//l-value reference
cout<<y<<endl;//3

y=10;
cout<<x<<endl;//10

}

 


2. call by

2-1. call by reference

  • 함수가 원본 인수의 값을 변경해야 할 때 사용됩니다.

→ &기호 사용


2-2. call by value

  • 전달되는 매개변수의 값을 복사합니다.
  • 호출된 함수는 매개변수를 수정할 수 있지만, 원본 변수를 변경할 수 없습니다.

→ 단점) 용량을 많이 차지함


2-3. call by constant reference

  • 매개변수가 큰 객체일 때 or 함수에 의해 변경되어서는 안 되는 경우, 용량은 큰데 변경할 필요가 없을 때 사용하면 좋다.
  • call by value를 사용하면 공간 낭비 크게 발생하는 경우에 사용한다.
  • ⚠️const를 붙이는 순간 rvalue도 들어올 수 있다. const이기 때문에 값을 바꾸는 경우가 없기 때문이다.

2-4 call by rvalue referenece

=an expression can be implemented by a move instead of a copy,

  • &&사용하면 r-value값을 참조할 수 있다.
  • copy대신 move 사용.
  • 어딘가 있는 r-value에 참조한 이름을 붙인 것이다.
int &x=3;
// 이건 안됨.
//&가 하나만 있으면 l-value
//3은 r-value 임.

int &x=y
//가능

int &&y=4;
//&& 하면은 r-value
//call by rvalue reference
//y를 위해서 메모리 공간을 만들지 않고 어딘가 있는 4에 y라는 이름을 붙여준 것이다. ⭐⭐⭐⭐

2-5. call by address

  • 메모리 주소를 사용하여 함수에 인수를 전달하는 것
  • 포인터 사용 (*)

 

3. The Big Five

=> 호출하지 않아도 자동으로 생성됨

⭐⭐⭐예제를 잘봐주세요! 예제로 이해하자!

vector<int>v1=v2
//copy Constructor

v1=v2;
//copy Assignment


v1=vector<int>{1,3,5}에서는 
//move  Constructor 

v1={3,5,7}은 
//move Assignment

 


3-1. Destructor (소멸자)

  delete

 

:객체가 소멸될 때 호출되는 함수로, 동적으로 할당된 메모리나 자원을 해제하는 역할.

→함수에서 정의되면은 함수가 끝날 때 사라진다.(stack)

→(heap)에 만들어지면은 지울 때 delete를 해줘야 한다. ⇒ ex) new로 만들 때

intcell*p= new intcell(n);

delete p;

3-2. Copy Constructor(복사 생성자)→ l-value

:● Deep Copy

:다른 객체로부터 현재 객체를 복사할 때 호출되는 함수

3가지 형태 다 맞는 표현

 

 

3-3.Move Constructor(이동 생성자)→ r-value(&&)

:다른 객체로부터 현재 객체를 이동할 때 호출되는 함수

 

3-4.Copy Assignment operator= (복사 할당 연산자)→ l-value

:다른 객체의 내용을 현재 객체에 복사할 때 호출되는 함수

 

3-5. Move Assignment operator= (이동 할당 연산자)→ r-value(&&)

:다른 객체의 자원을 현재 객체로 이동할 때 호출되는 함수

 

 

m4=m //copy Assignment
/*인 경우는 생성자는 필요 없는데 =이라는 걸 operator 함수를 정의해 주어야 한다.
 "m4 = m"은 "m4.operator=(m)"와 동일한 동작을 수행하기 때문이다.*/
IntCell&Intcell:: operator=(const Intcell &rhs) {
        if (this != &rhs) { // 자기 자신에게 대입되는 경우 방지
            value = rhs.value;
        }
        return *this; 
    }
        /*return *this;: 대입 연산자 함수의 반환 값으로 현재 객체의 참조를 반환합니다.
 이를 통해 연쇄적인 대입(a = b = c)이 가능해집니다.*/


x=y=z //copy assignment

/*x=y=z는  y.opertator=(z)가 호출된다.
"y=z"가 먼저 실행되고, 그 후에 "x=y"가 실행됩니다.*/


m4=move(m)//move assignment

/*m4=move(m)해주면
l-value-> r-value가 된다. move()의 특징. */

4. shallow copy, deep copy 차이

◆ shallow copy는 포인터의 값만 복사되어 두 객체가 같은 메모리를 가리키는 방식입니다. 이는 두 객체가 같은 데이터를 공유하게 됩니다.(복사생성자_reference와 유사)

 

◆ deep copy는 객체의 모든 내용이 복제되어 새로운 객체가 생성되는 방식입니다. 새로운 객체는 원본 객체와 완전히 독립적인 메모리를 가지게 됩니다.(call by value와 유사)

728x90