1. C언어와 다른 C++ 변수의 특징
- 함수의 중간에서 선언 가능
- 구조체 사용 시 struct를 표기하지 않아도 된다.
- 구조체를 만들 때 멤버를 초기화 할 수 있다. - C++ 11이상
- 2진수 표기법 / 자릿수 표기법
- C에는 없는 새로운 데이터 타입
struct Rect {
int x = 0;
int y = 0; // 구조체 멤버 초기화
}
int main() {
if(true) {}
int n = 0; // 함수 이후 변수 선언 가능
Rect rt; // C에서의 struct Rect rt; 에서 struct를 빼도 된다.
int n1 = 10; // 10진수
int n2 = 0x10; // 16진수
int n3 = 010; // 8진수
int n4 = 0b10; // 2진수
int n5 = 100'000'000; // 자릿수 표기법 - 꼭 3자리 마다 자르지 않아도 된다. (가독성을 위함)
bool check = true; // bool 타입 - true or false (C99)도 가능
long long n6 = 100; // 64bit 정수 (C++ 11)
// char16_t - UTF16 (C++ 11)
// char32_t - UTF32 (C++ 11)
// char8_t - UTF8 (C++ 20)
}
2. 일관된 초기화
- 변수를 초기화 할 때 중괄호 { } 를 사용하여 초기화 하는 것
- 중괄호 초기화(brace-init) 이라고도 표현
- C++ 11이상에서 가능
- 다양한 초기화 방법에서 하나의 통일된 방법으로 초기화가 가능
- 기존 초기화 단점 : 암시적 형변환에 따른 데이터 손실이 발생할 수 있다.
- 일관된 초기화 장점 : 데이터 손실이 발생할 경우 컴파일 에러가 발생한다.
- 함수의 인자로 중괄호 초기화를 사용 할 수 있다. - move({10});
3. Auto / Decltype
- Auto : 우측의 데이터형에 따라 좌측의 데이터형이 정해짐
- Decltype : 가로안의 데이터형에 따라 변수의 데이터형이 정해짐
int main() {
int a[3] = {1,2,3};
// double a[3] = {1,2,3};
auto b = a[0]; // int 나 double 형의 a를 쓰는지에 따라 b의 형이 정해짐
auto e; // error
decltype(b) c; // b의 데이터형으로 c가 만들어짐
decltype(b) d = b; // 초기값 설정 가능
}
3.1 배열과 타입 추론
- Auto : 우변이 배열이면 요소를 가르키는 포인터 타입으로 타입이 결정
- Decltype : 가로안의 표현식이 배열이면 가로안의 배열과 완전히 동일한 배열 타입으로 결정
=> 이 경우에는 초기화 불가
int main() {
int n = 10;
auto a = n; // int
decltype(n) b; // int
int arr[3] = {1,2,3};
auto a2 = arr; // 1. int a2[3] = arr 로 되지 않음. error / 배열로 초기화 x
// 2. int* a2 = arr 는 ok. 포인터로 지정
decltype(arr) b2; // int b2[3] 으로 ok.
decltype(arr) b3 = arr; // int b3[3] = x 로 되지 않음. error
}
3.2 Decltype과 함수 호출식
- decltype(함수명) => 함수 타입
- decltype(&함수명) => 함수 포인터 타입
- decltype(함수호출식) => 반환 타입 / 실제로 함수가 호출되는 것은 아님
int move(int a, double b) {
return 0;
}
int main() {
move(1, 3.7)
decltype(move) t1; // 함수 타입 - int(int, double)
decltype(&move) t2; // 함수 포인터 타입 - int(*)(int, double)
decltype(move(1, 3.7)) t3; // 함수 반환 타입 - int
}
* 타입을 알아보고 싶다면...
typeid(변수 이름).name() 을 사용하면 된다.
- <typeinfo> 헤더 파일 필요
- std::cout << typeid(a).name();
4. Using
- 기존 타입의 별칭(alias)을 만들 때 사용
- C++ 11 부터 도입된 문법
C에서의 typedef 와 C++의 using의 차이
- typedef는 타입의 별칭만 만들 수 있다.
- using은 타입 뿐 아니라 템플릿의 별칭도 만들 수 있다.
- 그래서 template alias라고도 부른다.
//typedef int DWORD;
//typedef void(*F)(int, int);
using DWORD = int;
using F = void(*)(int, int);
int main() {
DWORD = n; // int n
F f; // void(*f)(int, int)
}
'프로그래밍 > C++' 카테고리의 다른 글
[C++] C언어와 다른 C++ 함수(1) (0) | 2019.10.09 |
---|---|
[C++] 변수(2) (0) | 2019.10.05 |
[C++] iomanipulator (0) | 2019.10.05 |
[C++] C++ 표준 입출력 (2) | 2019.10.04 |
[C++] namespace 개념 (0) | 2019.10.03 |