fullstack

'전체 글'에 해당되는 글 76건

  1. [C++] 복사 생성자
  2. [C++] friend 선언
  3. [C++] this 포인터

[C++] 복사 생성자

Language/C++

- 복사 생성자란


복사 생성자란 자기 자신과 같은 형태의 객체를 인자로 받을 수 있는 생성자를 말한다.


다음은 복사 생성자의 예이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
class AAA
{
    int val;
public:
    AAA(int _val) {
        val = _val;
    }
    AAA(const AAA& a) {
        val = a.val;
    }
    void showValue() { cout << "value: " << val << endl; }
};
 
int main()
{
    AAA a1(10);
    AAA a2(a1);
 
    a1.showValue();
    a2.showValue();
 
    return 0;
}




복사생성자는 인자로 전달된 객체를 레퍼런스로 받아야 하며 내용 변경을 불가능 하게 하기 위해 const 선언을 한다.




- 다폴트 복사 생성자


일반 생성자와 소멸자처럼 복사 생성자도 디폴트 복사 생성자를 제공한다.

위 예제에서 11~13 라인을 지워도 자동으로 디폴트 복사 생성자를 삽입하기 때문에 똑같이 동작한다.


하지만 생성자내에서 동적할당을 하는경우 디폴트 복사 생성자에서는 얕은 복사(Shallow Copy)를 하게 되는데 이경우 문제가 발생한다.

따라서 깊은 복사(Deep Copy) 로 직접 복사 생성자를 구현해 주어야 한다.


'Language > C++' 카테고리의 다른 글

[C++] static 키워드  (0) 2015.12.02
[C++] const 키워드  (0) 2015.12.02
[C++] friend 선언  (0) 2015.12.02
[C++] this 포인터  (0) 2015.12.02
[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30

[C++] friend 선언

Language/C++

friend는 말그대로 친구를 말한다. 친구에게는 모든것을 허용해야 한다.

클래스안에서 private로 선언된 멤버변수는 외부 접근이 허용되지 않는 것이 원칙이다. 하지만 friend 선언을 통해서 접근을 허용할 수 있다.




- 전역 함수에 대한 friend 선언

 

1
2
3
4
5
6
7
8
9
10
11
class AAA
{
    int val;
public:
    friend void setValue(AAA& a, int val); // friend 선언
};
 
void setValue(AAA& a, int val)
{
    a.val = val;
}



원래대로라면 전역 함수 setValue에서 AAA객체의 val값에 접근할 수 없다.

하지만 5번째줄에서 friend 선언을 했으므로 접근이 허용되었다.




- 클래스에 대한 friend 선언

 

1
2
3
4
5
6
7
8
9
10
11
12
13
class AAA
{
    int val;
    friend class BBB;
};
 
class BBB
{
public:
    void setValue(AAA& a, int val) {
        a.val = val;
    }
};



클래스도 마찬가지로 friend 선언을 하면 private영역의 접근을 허용한다.

주의할 것은 friend 선언은 단방향적으로 AAA 클래스가 BBB 클래스에게 접근을 허용한 것이지 BBB 클래스또한 AAA 클래스에게 접근을 허용한 것은 아니다.




friend 선언은 매우 편리하지만 객체지향에서 중요시하는 '정보 은닉'을 해치는 경우를 초래할 수도 있으니 너무 많은 남발은 하지 않는 것이 좋다.


'Language > C++' 카테고리의 다른 글

[C++] const 키워드  (0) 2015.12.02
[C++] 복사 생성자  (0) 2015.12.02
[C++] this 포인터  (0) 2015.12.02
[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30
[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30

[C++] this 포인터

Language/C++

this 포인터는 자기참조 포인터이다. 즉, 자기 자신을 가리키는 용도로 사용된다.

만약 0x00번지에 할당된 객체의 멤버함수 내에서 this를 사용한다면, 0x00번지를 의미하는 포인터가 된다.


다음은 this를 포인터를 활용한 예이다.


1
2
3
4
5
6
7
8
9
class AAA
{
    int val;
public:
    AAA(int val)
    {
        this->val = val;
    }
};



위는 객체의 멤버변수와 생성자의 매개변수가 같은 이름을 사용하고 있다. 원래대로라면 어떤 변수이건간에 지역변수보다 우선시 될 수 없으므로 멤버변수에 접근할 수 없다.

하지만 this로 객체의 주소값을 가르켜 멤버변수에 접근하였다.

물론 매개변수와 멤버변수의 이름을 다르게 하면 쉽게 해결되지만 생각해야할 변수의 이름이 하나 줄어든 것 만으로도 큰 의미라고 할 수 있다.


'Language > C++' 카테고리의 다른 글

[C++] 복사 생성자  (0) 2015.12.02
[C++] friend 선언  (0) 2015.12.02
[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30
[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30
[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30