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++ 강좌
'Programming Language > C++' 카테고리의 다른 글
[C++] 상수형 매개변수와 상수형 메서드 (0) | 2024.02.04 |
---|---|
[C++] 클래스(Class) (2) - 정적 멤버, 정적 메서드 (0) | 2024.01.30 |
[C++] 클래스(Class) (1) (0) | 2024.01.30 |
[C++] 네임스페이스(namespace) (0) | 2024.01.30 |
[C++] C++ 스타일 함수 (0) | 2024.01.29 |