-
[C++ 14] 클래스 / 추가된 기능과 기억해야 할 내용프로그래밍 기초/C++ 2022. 5. 22. 11:32
클래스
생성자
= 단일 인수를 가지는 생성자는 대입 연산자로 생성해도 오버헤드가 발생하지 않는다.
class complex {
public:
complex(double r = 0, double i = 0) : r(r), i(i) {} // ...
}complex z4 = 4; // 과거에는 임시 변수를 생성해 오버헤드가 발생한다고 했으나 최신 컴파일러는 문제없이 최적화한다.
= 생성자가 여러 개 일 때 다른 생성자를 불러 초기화하는 것을 허용한다.
class complex
{
public:complex(double r, double i) : r{r}, i{i} {}
complex(double r) : complex{r, 0.0} {}
complex() : complex{0.0, 0.0} {}
// ...
}
= 멤버의 기본 값을 지정할 수 있다. 이 경우 생성자에서 초기화해주지 않아도 된다.
class complex
{
public:
complex(double r, double i) : r{r}, i{i} {}
complex(double r) : r{r} {}
complex() {}
// ...
private:
double r = 0.0, i = 0.0;
}
초기화 리스트
= 클래스 생성 시 여러 값을 초기 값으로 지정할 수 있다.
class vector
{
vector(std::initializer_list<double> values)
: my_size(values.size()), data(new double[my_size])
{
std::copy(std::begin(values), std::end(values), std::begin(data));
}
}
vector v = {1.0, 2.0, 3.0};
유니폼 초기화
= 일관된 방식으로 초기화를 지원한다.
complex c{7.0, 8}, c2 = {0, 1}, c3 = {9.3}, c4 = {c};
// 초기화 리스트를 사용하는 경우 원칙적으로 중괄호를 두 번 써야 하지만 생략을 지원한다.
vector v1 = {{1.0, 2.0, 3.0}}; // 이것은
vector v2 = {1.0, 2.0, 3.0}; // 이것과 같다.
이동 문법
이동 생성자
= 이동 키워드(&&)를 사용하여 이동 생성자를 구현하여 데이터를 복사하지 않고 이동시킬 수 있다.
class vector
{
vector(vector&& v)
: my_size(v.my_size), data(v.data)
{
v.data = 0;
v.my_size = 0; // 데이터를 복사한 뒤 원본의 데이터를 제거하여 이동을 구현한다.
}
}
이동 할당 연산자
= 대입 연산자에 이동을 적용하여 복사 후 원본을 비우는 형태로 만들 수 있다.
vector& operator=(vector&& src)
{
assert(my_size == 0 || my_size == src.my_size);
std::swap(data, src.data);
return *this;
}