Programming Language/C++

[C++] C++ 스타일 문법

lumana 2024. 1. 28. 11:12

C++ 스타일 문법


C++ 스타일 초기화

void EX1(void) {
    // int a = 10;  // 초기화, a = 10 : 대입, int a : 선언
    int a(10);  // c++ 스타일 초기화
    // a(5)는 불가능(함수인지, 변수인지 알 수 없다)
    int b(a);
    cout << "a = " << a << " b = " << b << endl;
}

범위 기반 for문

// 범위 기반 for문
void EX2(void) {
    int arr[10] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    // 배열의 각 칸을 변수처럼 사용하자.
    for (int n : arr) {  // arr안에 있는 모든 값을 n으로 놓고 쓰겠다.
        cout << n << endl;
        n++;  // arr을 루프마다 다시 받아서 의미가 없음.
    }
}
  • n++; 을 해도 arr 배열 각 원소의 값은 변하지 않는다

    • for 문을 돌면서 n의 값이 arr에 복사되는 것이고, n의 값이 증가한다 해서 arr의 값이 증가하는게 아님
  • l-value와 r-value(C11 이후)

    • 직관적으로 등호의 왼쪽에 있으면 l-value, 등호의 오른쪽에 있으면 r-value

    • l-value : 메모리 위치를 참조하는 식 (표현식 이후에도 사라지지 않는 이름을 갖는 변수)

      • int a = 3 에서 a에 해당

      • 주로 변수, 함수, 클래스를 나타내는 식별자를 의미

    • r-value : 표현식 이후에는 사라지는 값. 임시 값

      int val = 20;
      val = 777 + val;
      • line 1 에서 l-value인 val 변수가 가리키는 메모리에 r-value 20(임시값)을 저장한다

      • line 2에서 l-value인 val 변수가 가리키는 메모리에 r-value 777+val(임시 값)을 저장한다

      std::cout << add(a, b) << '\n';
      • add(a, b)가 r-value
    • 모든 l-value는 r-value 이지만, r-value는 l-value가 아닐 수 있다

참조자(레퍼런스 변수)

  • 위의 l-value와 r-value 개념을 이용하여 참조자를 만들 수 있다.

  • & 를 이용하면 l-value 참조자를 만들 수 있다.

  • && 를 이용하면 r-value 참조자를 만들 수 있다.

    void EX4(void) {
        // r-value : 수정할 수 없는 값(숫자 : 3)
        int a(5);
        int &r1 = a; // r1은 l-value 참조자
        // int &r2= 3; --> 불가능 (l-value 참조자가 r-value를 참조하므로)
        // int &r3 = a * a; ---> 불가능 (l-value 참조자가 r-value를 참조하므로)
        int &&r2 = 3; // r2는 r-value 참조자
        int &&r3 = a * a;  // 함수의 return값도 수정할 수 없는 값이므로 참조 가능.
        cout << a << endl;
        cout << r1 << endl;
    }
    • r1은 l-value 참조자로서, 변수 a(l-value)를 참조하고 있다

      • r1은 l-value 참조자이므로, a의 메모리 위치를 참조한다.
    • r2, r3는 r-value 참조자로서, 각각 r-value인 3과 a*a를 참조하고 있다

    int function() {
        return int;
    }
    
    int&& ref = function();
    • 이런 식으로도 R-value 참조자를 만들 수 있다

참조) 두들낙서 C/C++ 강좌

참조) L value & R value - 둘 간의 차이점 :: 껍데기방