본문 바로가기

카테고리 없음

C++ 무작정 따라하기 - 1. 기본 용어 정리

1. 선언 :

   특정 대상의 "이름" , "타입" 을 컴파일러에게 제공하는 행위.


2. 정의

   선언 이후의 구체적인 세부 사항을 컴파일러에게 제공하는 행위.

=================================================

int x;   //객체 선언(정의)


void Function ( int a ); //함수 선언(시그니처)


void Function (int a )  //함수 정의 

{

return;

}


---------------------------------------------------------------------------------

***시그니처 (Signature)

 - 함수의 매개변수 리스트 / 반환 타입을 말함. 모든 함수의 선언에는 함수의 시그니처가 들어간다.

---------------------------------------------------------------------------------

class widget;             //클래스 선언


class widget               //클래스 정의

{

public :

int a;

int c;


public : ~~~

widget () ;

~widget();



}



=================================================

3. 초기화

   어떤 객체에 최초의 값을 부여하는 과정.

=============================


int x ; //변수 선언


x = 9; // 변수 초기화


int c = 0 ;  //선언과 초기화 동시에


=================================================

사용자 정의 타입으로 생성된 객체의 경우( Struct, Class)  초기화는 생성자에 의해 이루어진다.


=================================================

ex ) 


Widget( int b )     //생성자에 의한 Widget 객체의 멤버 변수 초기화.

{

a = 0;

c = b;

}


=================================================


4. 복사 생성자

 어떤 객체의 초기화를 위해 그와 같은 타입의 객체로부터 초기화 할 때 호출되는 함수.

-> 초기화일때 가능하다는 점에서 복사 대입 연산자와는 다름.

 

4-1 복사 대입 연산자

 같은 타입의 다른 객체에 어떤 객체의 값을 복사하는 용도로 쓰이는 함수.

-> 이미 존재하는 객체라도(인스턴스) 복사 대입 연산자를 통해서 다른 객체의 값을 복사할 수 있다.


둘 모두 디폴트로 두면 얕은 복사를 제공하므로,

멤버 변수에 포인터가 있다면 반드시 깊은 복사를 할 수 있도록 재정의 해 주어야 한다.


================================================================


class example

{

public :

example();                                                    //생성자

example( const example& old );                       //복사 생성자

example & operator = (const example& old);    //복사 대입 연산자

};


example a;                        //생성자 호출


example b(a);                     // 복사 생성자 호출


b = a;                            //복사 대입 연산자 호출


example c = b;                     // 복사 생성자 호출!!!


====================================================================



값에 의한 객체 전달을 정의해 주는 함수가 바로 복사 생성자이다.


기본적으로 C++ 는 함수로부터 객체를 전달받거나, 함수에 객체를 전달할 때 값에 의한 전달 ( pass by value) 를 사용한다.

함수 매개변수는 실제 인자의 "사본" 을 통해 초기화되며, 반환값의 사본을 올려받는다.


즉 사본을 만들어내는 이유가 바로 복사 생성자이며, 값에 의한 전달은 이 때문에 "고비용" 연산이 되고 만다.

Call by vlaue 보다는 const & 를 통해 주소를 읽어 생성자의 생성을 피할 곳을 피해주면 좋다.

========================================================================

ex ) 


Test t1;        => 기본 생성자
 Test t2(t1);    => 복사 생성자
 Test t3 = t1;   => 복사 생성자
 t1 = t2;        => 복사 대입 연산자
     
 cout << isEmpty(t1) << endl;    => Call-by-Value는 복사 생성자



출처: http://pmoncode.tistory.com/23 [싶어그래]


=======================================================================

복사생성자와 복사대입연산자의 차이

복사생성자(copy constructor) 
-> 
 어떤 객체의 초기화를 위해 그와 
같은 타입의 객체로 부터 초기화할때 호출되는 함수.
 
복사대입연산자(copy assignment operator):
->
 
같은 타입의 다른 객체에 어떤 객체의 값을 복사하는 용도로 쓰이는 함수입니다.

둘다 정의를 안해줄경우 디폴트 = 얕은 복사.
디폴트 복사생성자, 디폴트 대입연산자 둘은 모두 얕은 복사를한다.!!! 
그러므로 포인터를 가지는 경우 복사생성자와 대입연산자를 정의해주는 습관을 들이는 것이 좋다.

출처 :http://skmagic.tistory.com/181