티스토리 뷰
1. 9-9 복사 생성자, 복사 초기화, 반환값 최적화 (Return value optimization)
Fraction(const Fraction &fraction) //copy constructor
: m_numerator(fraction.m_numerator), m_denominator(fraction.m_denominator)
{
cout << "Copy constructor called" << endl;
}
- Fraction frac_copy = frac; 이 경우에도 copy constructor는 호출 된다.
- Fraction frac_copy(frac); 원래는 이렇게 하려한거임!
- Fraction frac_copy(Fraction(2,3)); 익명객체로 할 시에는 복사생성자 호출안함
<10/25>
2. 9-10 변환 생성자(converting constructor) explicit, delete
- doSomething(7); 도가능 7을 생성자에 넣는다
- explicit 은 위의 행위를 막을 수 있다.
- Fraction(char) = delete;
3. 9-11 대입 연산자 오버로딩, deep copy, shallow copy
- cout << (int*)hello.m_data << endl; m_data가 char*형인데 cout 이 문자열로 인식하기 때문에 int*로 캐스팅해서 주소값을 확인
- 생성될 때 복사생성자를 호출한 인스턴스는 생성자호출을 안했으므로
~MyString()
{
delete[] m_data;
}
부분에 문제가 생긴다. shallow 카피의 문제라는 것
- [깊은 복사]
MyString(const MyString &source)
{
cout << "Copy constructor" << endl;
m_length = source.m_length;
if (source.m_data != nullptr)
{
m_data = new char[m_length];
for (int i = 0; i < m_length; i += 1)
{
m_data[i] = source.m_data[i];
}
}
else
m_data = nullptr;
}
- [대입 연산자 오버로딩]
MyString& operator = (const MyString & source)
{
cout << "Assignment operator" << endl;
if (this == &source) // prevent self-assignment
return *this;
delete[] m_data;
m_length = source.m_length;
if(source.m_data != nullptr)
{
m_data = new char[m_length];
for (int i = 0; i < m_length; i += 1)
{
m_data[i] = source.m_data[i];
}
}
else
m_data = nullptr;
return *this;
}
- MyString str1 = hello; <== 깊은 복사
MyString str2; str2 = hello; <== 대입 연산자 오버로딩
- 아예 copy 를 막는법 : MyString(const Mystring &source) = delete;
3. 9-12 Initializer list
IntArray(const std::initializer_list<int> &list) : IntArray(list.size)
{
int count = 0;
for (auto &element : list)
{
m_data[count] = element;
++count;
}
}
'technote > C++' 카테고리의 다른 글
따배씨 11-2 (0) | 2018.11.01 |
---|---|
따배씨 11.1 (0) | 2018.11.01 |
따배씨 9-5 ~ 9-8 (0) | 2018.10.24 |
따배씨 9-1 ~ 9-4 (0) | 2018.10.24 |
따배씨 8-12 ~ 8-15 (0) | 2018.10.23 |