※ C++11/14에서 새롭게 추가된 자동 타입 변환 키워드이다.
※ auto 사용 시 주의사항
- auto 키워드는 함수 매개변수로 사용불가!
- auto 키워드는 구조체나 클래스의 멤버 변수로 사용 불가( ∵객체 자료형 크기를 모르기 때문)
- 가독성이 떨어짐으로 적절한 사용이 필요.
※ auto 키워드
선언된 변수의 초기화 식을 사용하는 것으로 컴파일러가 알아서 해당 타입을 추론 (type inference)하게 한다.
이 기능은 생성 시 변수를 초기화 할 때만! 작동한다. ( ∵ 초기화된 값을 기준으로 자료형을 선택해서)
※ auto를 이용한 자료형
int r = 20;
double PI = 3.14159265358979;
auto *pi = Π // 포인터도 가능
auto &Pi = PI; // 참조자도 가능
auto S = r*r*PI; // double S
cout << S; // 출력값: 1256.64
※ auto를 이용한 for문 출력
auto arr = { 1, 2, 3, 4 };
for (auto num : arr)
cout << num << ' '; // 1 2 3 4 출력
for (const auto& p : photos) {
wcout << "Photo location: " << (static_pointer_cast<Photo>(p))->location_ << endl;
}
※ auto를 이용한 함수
auto S(int r, double pi){
return r*r*pi;
}
※ decltype 키워드
declared type 즉, 선언된 형식의 줄임말로 주어진 이름, 표현식의 구체적 타입을 알려주는 키워드이다.
이는 template에 기반한 제네릭 프로그래밍의 어려움을 해소하기 위해 도입되었다.
ex.
template<typename FirstType, typename SecondType>
??? AddArbitrary(FirstType first, SecondType second) {
cout << first + second << endl;
}
int main() {
AddArbitrary(1234, 'C'); // FirstType이 returnType
AddArbitrary('C', 1234); // SecondType이 returnType
}
template<typename FirstType, typename SecondType>
decltype(first+second) AddArbitrary(FirstType first, SecondType second) { //Err!
cout << first + second << endl;
}
§ auto vs decltype
- auto: 값에 상응하는 타입을 "컴파일러가" 추론하는 키워드
- decltype: 값으로부터 타입을 추출하는 키워드
template<typename FirstType, typename SecondType>
auto AddArbitrary(FirstType first, SecondType second) -> decltype(first+second){
cout << first + second << endl;
}
auto + ->decltype()을 이용해서 문제를 해결할 수 있다!
※ 범위기반 for문
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
int main() {
int num;
for (int i = 0; i < 5; i++){
//cin >> v[i]; // 이건 왜 오류나는가
cin >> num;
v.push_back(num);
}
sort(v.begin(), v.end(), greater<int>());
for (const auto& num : v)
cout << num << " ";
}
C++11에서 새롭게 도입된 유형의 루프로 더 간단하고 안전하게 배열등의 모든 요소를 반복하는 방법이다.
§ 범위기반 for문의 가장 큰 특징
표현식 안의 모든 값에 대해 한번씩 루프를 실행!
범위기반 for문은 index 정보가 없고 배열요소를 변경할 수 없다.
즉, for문을 완전히 대체하지는 못한다.
따라서 컨테이너의 간단한 순회를 위해 사용된다!
보통 auto와 같이 사용되는 경우를 심심치 않게 볼 수 있기에 사용법을 알고 있는게 좋을 것이다.
※ 선언방법
for (자료형 변수 : 배열종류의 이름)
예를 들어 다음과 같이 선언할 수 있다.
순서는 다음과 같다.
int main() {
int arr[] = { 1, 3 , 4, 5, 5, 8};
for (int num :arr)
cout << num << " ";
}
1. for문 실행, num에 arr의 첫 요소인 0이 할당
2. 그 후 0을 출력하는 cout 실행
3. 다시 for문 실행, 이 과정을 요소 8까지 반복
★ 배열에 대한 인덱스가 아닌, 배열의 요소값이 num에 할당된다!
여기서 자료형 변수 위치에 배열요소와 같은 자료형을 가져야 하기에 auto키워드로 자료형을 추론하게 하는 것이 좋다.
또한, 읽기 전용으로 사용하려할 때, (수정되지 않게끔) const 키워드를 붙여 다음과 같이 선언할 수 있다.
(성능상의 이유로 범위기반 for문에서 const 참조를 사용하는 것이 좋다.)
int main() {
int arr[] = { 1, 3 , 4, 5, 5, 8};
for (const auto& element :arr)
cout << element << " ";
}
포인터로 변환된 배열 (array decay into pointer)의 경우, 배열의 길이를 몰라 범위기반 for문을 사용할 수 없다.
int sumArray(int array[]) {
int sum = 0;
for (const auto& number : array) // 컴파일 에러, 배열크기를 모름
sum += number;
return sum;
}
int main() {
int array[5] = { 9, 7, 5, 3, 1 };
cout << sumArray(array); // 배열이 포인터로 decay
}
'C | C++ > C++' 카테고리의 다른 글
this.code(13)_ 파일처리와 stream (feat. TermProject) (0) | 2022.11.08 |
---|---|
this.code(11)_ Exception Handling (예외 처리), Exception 클래스, noexcept (0) | 2022.10.29 |
this.code(10)_ template (★★★★★)과 함수객체(functor) (0) | 2022.10.29 |
this.code(9)_ smart pointer & type casting_ part 2. (0) | 2022.10.29 |
★this.code(8)_ type casting_ part 1. cast operator (★★★) (0) | 2022.10.29 |