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 [싶어그래]
=======================================================================
-> 어떤 객체의 초기화를 위해 그와 같은 타입의 객체로 부터 초기화할때 호출되는 함수.
-> 같은 타입의 다른 객체에 어떤 객체의 값을 복사하는 용도로 쓰이는 함수입니다.
둘다 정의를 안해줄경우 디폴트 = 얕은 복사.
디폴트 복사생성자, 디폴트 대입연산자 둘은 모두 얕은 복사를한다.!!!
그러므로 포인터를 가지는 경우 복사생성자와 대입연산자를 정의해주는 습관을 들이는 것이 좋다.