이번 포스팅부터는 C++11에 추가된 여러 문법들에 대해 공부해 보겠다.
C++11 부터 Modern C++이라고 한다. 그 만큼 많은 변화가 있었다. 꼭 알아두어야 한다.
auto
auto 키워드는 우리가 변수를 선언할 때, 지정해준 자료형 대신 사용할 수 있다. 자동으로 컴파일러가 자료형을 추론해서 자료형을 지정해 주는것이다.
#include <iostream>
using namespace std;
class A
{
};
int main()
{
int a = 3;
float b = 3.2f;
A c = A();
const char* e = "asd";
// 컴파일러가 오른쪽 값을 보고 자동으로 추론
auto a = 3;
auto b = 3.2f;
auto c = A();
auto e = "asd";
return 0;
}
컴파일러의 추론 규칙은 생각보다 많이 복잡해질 수 있다. 이는 나중에 실력이 쌓이면 그때 제대로 공부하면 된다.
주의해야할 점이 있다.
기본 auto는 const, &를 무시한다는 점이다.
#include <iostream>
using namespace std;
int main()
{
int a = 3;
int& ref = a;
const int cst = a;
auto test1 = ref; // 무시 -> int로 추론
auto test2 = cst; // 무시 -> int로 추론
return 0;
}
그래서 힌트를 주어야 한다.
auto& test1 = ref;
const auto test2 = cst;
중괄호 초기화 { }
기존의 초기화 방식에서 새로 추가된 변수 초기화 방식이 늘어난 것이다.
#include <iostream>
#include <vector>
using namespace std;
class Knight
{
public:
Knight(){}
Knight(int a, int b){}
Knight(initializer_list<int> i){}
};
int main()
{
int a = 0;
int b{ 0 }; // 중괄호 초기화
Knight k1;
Knight k2 = k1; // 복사 생성자(대입 연산자x)
Knight k3{ k2 }; // 중괄호 초기화
// 중괄호 초기화를 하는 이유는 무엇인가?
// 배열을 사용할 때에는 우린 이미 중괄호를 이용해서 초기화를 했다.
// 그것과 형식을 맞췄다고 보면 됨.(코드의 통일성)
// 장점
// 1) vector 등 container과 잘 어울린다.
vector<int> v{1, 2, 3, 4};
// 2) 축소 변환 방지
int x = 0;
double y{ x };
// 단점
// 1) 과연 int 2개 생성자와 initializer_list 생성자 중 어떤 걸 호출하게 될까?? 바로 initializer_list 생성자가 호출된다
// 어떤 생성자를 호출하려고 하던 list를 입력해주면 무조건 initializer_list만 호출됨.
Knight k5{ 1,2};
return 0;
}
어떤 방식을 사용할지는 정말 사용자의 마음에 따라 다르다. 하지만 내가 코드를 읽을줄 알아야 하니 꼭 알아두자.
nulltpr
고전적인 사람들 전부 다 사용하고 이게 c++11 에서 왔다는 사실 조차 모를 정도로 정말 많이 사용하고 있다.
그 전에는 nullptr을 표현하기 위해서는 0 이나 NULL로 표현했다. NULL은 그냥 단순히 vs에서 #define NULL 0 으로 정의되어 있는 것이다.
0과 NULL을 사용하는건 문제가 발생할 수 있다.
#include <iostream>
#include <vector>
using namespace std;
void Test(int a)
{
cout << " a " << endl;
}
void Test(void* ptr)
{
cout << "포인터" << endl;
}
int main()
{
int* ptr = NULL; // 0 NULL
// 사용 이유
// 1) 오동작
Test(0);
Test(NULL);
Test(nullptr);
return 0;
}
만약 우리가 NULL을 포인터로 사용하고 싶은데도 불구하고 a 가 출력될 것이다. 그러므로 nullptr을 통해 포인터로 활용할 수 있게된다.
또한 가독성이 매우매우 늘어나는 것을 볼 수 있다.
그렇다면 nullptr은 무엇이길래 알아서 포인터로 취급을 할 수 있을까?
auto를 사용해서 nullptr을 추론하면 바로 nullptr_t라는 어떤 클래스인 것이다.
'C++ > 기초' 카테고리의 다른 글
[Modern C++] 오른값 참조(rvalue reference), 전달 참조(forwarding reference) (1) | 2023.12.06 |
---|---|
[Modern C++] using, enum class, delete(삭제된 함수), override, final (0) | 2023.12.06 |
[C++] STL - deque, map, set, multimap, multiset (1) | 2023.12.05 |
[C++] STL - List (0) | 2023.12.04 |
[C++] STL - Vector (1) | 2023.12.04 |