메모리 공간의 할당 이후에 생성자의 호출까지 완료되어야 '객체'라 할 수 있다. 

즉, 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다. 그리고 이러한 기중에 예외를 두지 않기 위해서 생성자를 정의하지 않는 클래스에는 C++ 컴파일러에 의해서 디폴트 생성자라는 것이 자동으로 삽입된다.


- 디폴트 생성자는 인자를 받지 않으며, 내부적으로 아무런 일도 하지 않는 생성자이다. -


class A

{

int num;


public:

int GetNum(void)

{

return num;

}

};


class A

{

int num;


public:

A() {} //디폴트 생성자.

int GetNum(void)

{

return num;

}

}; 


위의 2개의 클래스는 완전히 동일하다.


따라서, 모든 객체는 한번의 생성자 호출을 동반한다. 이는 new 연산자를 이용한 객체의 생성에도 해당하는 이야기다. 

즉, 위의 클래스를 다음의 형태로 생성해도 객체의 생성과정에서 생성자가 호출된다.

A * ptr = new A;


단, 다음과 같이 new연산자가 아닌, C언어의 malloc 함수를 대신 이용하면 생성자는 호출되지 않는다.

A * ptr = (A*)malloc(sizeof(A));


malloc 함수호출 시, 실제로는 A클래스의 크기정보만 바이트 단위로 전달되기 때문에 생성자가 호출이 되지 않는다.


$ 객체를 동적으로 할당하려는 경우에는 반드시 new 연산자를 이용해야 한다.



생성자 불일치


위에 보인, 매개변수가 void형으로 선언되는 디폴트 생성자는 생성자가 하나도 정의되어 있지 않을 때에만 삽입이 된다. 즉, 다음과 같이 정의된 클래스에는 디폴트 생성자가 삽입되지 않는다.


class A

{

int num;


public:

A(int n) : num(n) {} //int형 하나를 인자로 받는 생성자.

};


따라서 다음의 형태로는 객체성성이 가능하다.

A simple(10);

A * simPtr = new A(10);


그러나 다음의 형태로는 개체생성이 불가능하다. 다음 문장에서 요구하는 생성자가 정의되지도, 자동으로 삽입되지도 않았기 때문이다.

A simple;

A * simPtr = new A();


따라서 위의 형태로 객체를 생성하기 원한다면, 다음의 형태로 생성자를 추가해야 한다.

A() : num(0) {}

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

소멸자(Destructor)  (0) 2012.05.20
private 생성자  (0) 2012.05.20
이니셜라이저(Initializer)  (0) 2012.05.19
생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
Posted by scii
:


멤버 이니셜라이저(Member Initializer) 를 이용한 멤버 초기화



11라인에서 이니셜라이저가 쓰였는데 이것은 이렇게 된다. int num1 = n1;


또 다른 멤버 이니셜라이저를 이용한 멤버 초기화


class Rectangle

{

private:

Point upLeft;

Point lowRight;


public:

Rectangle(const int &x1, const int &y1, const int &x2, const int &y2)

:upLeft(x1, y1), lowRight(x2, y2) //이니셜라이저

{

                //empty

}

};

/* 여기서 Rectangle 클래스는 두 점의 정보를 직접 전달받을 수 있게 정의되어있다. 그리고 "이니셜라이저"를 통해 이 정보를 멤버인 Point 객체를 초기화하고있다. */


멤버 이니셜라이저가 의미하는 바

1. 객체 upLeft의 생성과정에서 x1과 y1을 인자로 전달받는 생성자를 호출하라.

2. 객체 lowRight의 생성과정에서 x2와 y2를 인자로 전달받는 생성자를 호출하라.


이렇듯 멤버 이니셜라이저는 멤버변수로 선언된 객체의 생성자 호출에 활용된다.


따라서, 프로그래머는 생성자의 몸체에서 초기화 하는 방법과 이니셜라이저를 이용하는 초기화 방법 중에서 선택이 가능하다.

그러나 일반적으로 멤버변수의 초기화에 있어서는 이니셜라이저를 선호하는 편이다.

여기에는 다음 두 가지 이점이 있기 때문이다.


1. 초기화의 대상을 명확히 인식할 수 있다.

2. 성능에 약간의 이점이 있다.




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

private 생성자  (0) 2012.05.20
디폴트 생성자(Default Constructor)  (0) 2012.05.20
생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
const 함수  (2) 2012.05.08
Posted by scii
:




chramp() 익스프레션을 이용하여 제어하기.




'Houdini > SOP' 카테고리의 다른 글

12.06.07_THU  (0) 2012.07.05
높은 지역에서만 파티클 날리기  (0) 2012.07.04
point sop과 foreach sop  (0) 2012.05.03
RGB나누기  (0) 2012.05.02
sin과 if를 이용해 사방으로 흩어지게 연출  (0) 2012.05.01
Posted by scii
:

짝수 공식

Houdini/Houdini etc 2012. 5. 16. 00:51 |

(어떤수) 나누기 2 => 그 다음, 올림(ceil), 내림(floor), 반올림(round)를 한 후 => 곱하기 2 


floor((어떤수)/2)*2


그러면, 어떤수에 무엇이와도 그 수는 짝수가 된다.


ex) ceil(bbox("../null", D_XSIZE)/2)*2

ex) int(bbox("../null", D_XSIZE)/2)*2

Posted by scii
:

'Programming > Simulation' 카테고리의 다른 글

...  (0) 2012.11.19
Posted by scii
:

생 성 자


클래스 정의에서 다음의 형태를 띠는 함수가 생성자이다.


# 클래스의 이름과 함수의 이름이 동일하다.

# 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다.


이러한 유형의 함수를 가리켜 '생성자'라 하며, 생성자는 "객체 생성시 딱 한번 호출된다."

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


* 생성자도 함수의 일종이니 오버로딩이 가능하다.

* 생성자도 함수의 일종이니 매개변수에 '디폴트 값'을 설정할 수 있다.





28라인의 함수 void SimpleClass(void) 와 46라인의 함수void SimpleClass(int n1=1, int n2=0) 를 다음과 같은 문장으로 구성하면 안된다.

SimpleClass sc1();                (X)



다음과 같이 구성을 해야 한다.

SimpleClass sc1;                                                    (O)

SimpleClass * ptr = new SimpleClass;                  (O)

SimpleClass * ptr = new SimpleClass();                (O)


매개변수가 선언되어 있지 않으니 소괄호를 생략할 수 있다.



그렇다면, 다음 문장도 허용이 가능할 것 같은데 허용이 안된다!!

SimpleClass sc1();                (X)



예제)



출력 결과 : 20, 30


※ 보통 함수의 원형은 전역적으로(함수 밖에) 선언하지만, 위 예제에서 보이듯이 함수내에 지역적으로도 선언 가능하다.


위 예제의 42라인의 문장은 이러한 함수의 원형 선언에 해당된다. 즉, 이 문장을 void형(인자를 받지 않는) 생성자의 호출문으로 인정해 버리면, 컴파일러는 이러한 문장을 만났을 때, 이것이 객체생성문인지 함수의 원형선언인지를 구분할 수 없게 된다.


그래서 이러한 유형의 문장은 객체생성이 아닌, 함수의 원형선언에만 사용하기로 약속하였다.


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

디폴트 생성자(Default Constructor)  (0) 2012.05.20
이니셜라이저(Initializer)  (0) 2012.05.19
캡슐화  (0) 2012.05.12
const 함수  (2) 2012.05.08
정보은닉(Information Hiding)  (0) 2012.05.03
Posted by scii
:

캡슐화

Programming/C++ 2012. 5. 12. 02:11 |
캡슐화
:하나의 목적 하에 둘 이상의 기능이 모여서 하나의 목적을 달성.

캡슐화에는 정보은닉이 기본적으로 포함된다.

캡슐화는 감싸는 개념이다. 그런데 감싸려면 안전하게 감싸야 한다. 다시 말해서 이왕이면 멤버변수가 보이지 않게 정보를 은닉해서 감싸는 것이 좋다. 그래서 캡슐화는 기본적으로 정보은닉을 포함하는 개념이라고 이야기한다.

※ 캡슐화는 어려운 개념이다. 왜냐하면 캡슐화의 범위를 결정하는 일이 쉽지 않기 때문이다.

#include <iostream>


using namespace std;


class Point 

{

    private:

        int xpos, ypos;


    public:

        void Init(int x, int y)

        {

            xpos = x;

            ypos = y;

        }

        

        void ShowPointInfo(void) const

        {

            cout<<"["<<xpos<<", "<<ypos<<"]"<<endl;

        }

};


class Circle 

{

    private:

        int rad;

        Point p;


    public:

        void Init(int x, int y, int r)

        {

            rad = r;

            p.Init(x, y);

        }


        void Show(void) const

        {

            cout<<"radius: "<<rad<<endl;

            p.ShowPointInfo();

        }

};


class Ring

{

    private:

        Circle c1;

        Circle c2;


    public:

        void Init(int x1, int y1, int r1, int x2, int y2, int r2)

        {

            c1.Init(x1, y1, r1);

            c2.Init(x2, y2, r2);

        }


        void ShowRingInfo(void) const

        {

            cout<<"Inner Circle Info..."<<endl;

            c1.Show();

            cout<<"Outter Circle Info..."<<endl;

            c2.Show();

        }

};


int main(void)

{

    Ring ring;

    ring.Init(1, 1, 4, 2, 2, 9);

    ring.ShowRingInfo();

    return 0;

}


이 코드에서 주목할 점.


Ring 클래스, Circle 클래스, Point 클래스 모두 자신의 정보를 출력하기 위한 함수를 멤버에 포함시켜서 캡슐화를 완성하였다.

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

이니셜라이저(Initializer)  (0) 2012.05.19
생성자(Constructor)  (0) 2012.05.12
const 함수  (2) 2012.05.08
정보은닉(Information Hiding)  (0) 2012.05.03
Message Passing  (0) 2012.05.02
Posted by scii
:


vimbook-OPL.pdf


문자열 치환: %s/old/new/g  => %는 문서전체, s는 치환, old는 찾는 문자열, new는 바꿀 문자열, g는 한줄에 여러개 있는 것 다 바꿈. global


화면 분할: ctrl + sw -v 또는 :split, vsplit


분할된 화면에서 파일 부르기: E, e/mnt/rrr/hello.cpp


좌우 비교: diffthis (양쪽에서 모두 명령어를 넣어주어야한다.)


서로 다른 블록에서 반대쪽으로 내용 덮어쓰기: diffput


서로 다른 블록에서 반대쪽 내용으로 덮어쓰기: diffget

'Vim > Tutorial' 카테고리의 다른 글

vim 에러 처리  (0) 2013.02.02
명령어 표기법에 대해서  (0) 2013.02.02
Vim Key mapping  (0) 2013.01.16
유용한 명령어들 몇가지  (0) 2013.01.15
vi editor  (0) 2012.05.02
Posted by scii
: