Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ 강좌/문서
[31] (02) Overload in C++ (1)
남병철.레조 [lezo] 9160 읽음    2009-06-21 11:50


[목차]

(1) 워밍업~
(2) 함수 겹지정 & 기본 인수
(3) static 멤버 데이타 & static 멤버 함수
(4) 참조
(5) 연산자 겹지정
   0. 워밍업~
   1. 2진 연산자 겹지정
   2. 1진 연산자 겹지정
   3. 객체에서 기본형으로(형변환)
   4. 객체에서 객체로(형변환)
   5. '=' 겹지정
   6. '[]' 겹지정
   7. 겹지정 연산자의 정밀 조정











(1) 워밍업

   - inline 함수
   inline 함수는 실제 '호출'하는 시간적 낭비가 없다.
   호출하는 위치에 함수의 본문을 삽입하므로써 그런일이 가능하다.
   하지만 함수가 길거나 여러번 호출하는 경우에는 inline 한수를 호출하는 것은
   바람직 하지못하다.
   inline void func1();

   inline void func1() {
       // command line
   }

   func();



   Class 사양 안에 정의된 구성원 함수는 무조건 inline이다.
   inline 키워드를 사용하든 말든...
   class anyClass
   {
   public:
       void andfunc() {       // inline function
           // command line
       }
   };



   비구성원 함수 및 Class 외부에 정의된 멤버 함수는 inline이 아니다.
   (inline 키워드를 사용하면 inline이 가능하다)
   class anyClass
   {
   public:
       void anyfunc();
   };

   void anyClass::anyfunc() {
       // command line
   }

   위에서 구성원 함수는 무조건 inline이라고 했었다.
   하지만 구성원 함수일지라도 또한 inline이라는 키워드를 ㅤㅆㅓㅅ을지라도
   컴파일러가 판단하기에 너무 복잡하다고 생각하면 프로그래머가 어떻게
   지정하든 그것을 평범한 함수로 만든다.
   이경우 프로그래머는 컴파일러에 단지 inline을 권장하는 역할밖에 할 수
   없다.(모든 함수에 이 사실이 적용되는지는 아직 모른다.-컴팔러 맘 ㅡ.ㅡ;)





(2) 함수 겹지정 & 기본 인수

   - 겹지정
   컴파일러는 같은 이름을 가진 어떤 함수를 또 다른 것과 어떻게 구별할까?
   이를 위해 name mangling이라는 프로세스가 필요하다.
   (예를 들면, average( int, int ) 이라면 average_int_int()로 컴파일러
    가 변형시킨다. 물론 정확한 표현은 컴파일러에 따라 다르다.
    주의할 점으로 함수의 리턴형은 name mangling의 일부가 아니라는 것이다.)

   겹지정 함수는 대개 서로 다른 데이터형에 대해 비슷한 연산을 수행해야 할 때
   사용한다.


//---------------------------------------------------------------------------]
// 작성일 : 2001.08.21
// 제  목 : 함수 Overload
// 작성자 : 남병철
//---------------------------------------------------------------------------

#include 
#include 
#pragma hdrstop

//---------------------------------------------------------------------------

const int MAX_LENGTH = 40;

class fancy_text
{
private:
    char text[ MAX_LENGTH ];
public:
    void set_text( char tx[] ) {
        strcpy( text, tx );
    }

    void box_display();
    void box_display( char );
    void box_display( char, int );
};

//---------------------------------------------------------------------------

void fancy_text::box_display()
{
    cout << "----------------------------------------"; // '-' 40개
    cout << endl << text << endl;
    cout << "----------------------------------------";

}

void fancy_text::box_display( char ch )
{

    for( int j = 0; j < MAX_LENGTH; j++ )
        cout << ch;

    cout << endl << text << endl;
    for( int j = 0; j < MAX_LENGTH; j++ )
        cout << ch;

}

void fancy_text::box_display( char ch, int n )
{

    for( int j = 0; j < n; j++ )
        cout << ch;

    cout << endl << text << endl;
    for( int j = 0; j < n; j++ )
        cout << ch;

}

//---------------------------------------------------------------------------

#pragma argsused
void main()
{

    fancy_text ft1;

    ft1.set_text( "Gone with the Wind" );

    ft1.box_display();
    cout << endl << endl;

    ft1.box_display( '=' );
    cout << endl << endl;

    ft1.box_display( '=', 18 );
    cout << endl << endl;

    getch();

}

//---------------------------------------------------------------------------

(결과)
----------------------------------------
Gone with the Wind
----------------------------------------

========================================
Gone with the Wind
========================================

==================
Gone with the Wind
==================

//---------------------------------------------------------------------------
- 기본 인수 한 함수가 마치 여러 함수인 것처럼 작동한다. 기본 인수를 갖는 인수는 반드시 마지막 것이어야 한다.(몇개일지라도) 기본 인수는 1. 특정한 상황에서 함수의 단순화된 버전 또는 기본 버전을 사용할 수 있는 경우 사용된다. 2. 개발중인 함수. 즉, 기본값은 기존 함수 호출이 제대로 작동하게 하면서도 미래의 호출에서 더 많은 인수를 사용하는 개정판 함수의 이용을 가능하게 한다.
//---------------------------------------------------------------------------]
// 작성일 : 2001.08.21
// 제  목 : 기본 인수
// 작성자 : 남병철
//---------------------------------------------------------------------------

#include 
#include 
#pragma hdrstop

//---------------------------------------------------------------------------

const int MAX_LENGTH = 40;

class fancy_text
{
private:
    char text[ MAX_LENGTH ];
public:
    void set_text( char tx[] ) {
        strcpy( text, tx );
    }

    void box_display( char ch = '-', int n = MAX_LENGTH );

};

//---------------------------------------------------------------------------

void fancy_text::box_display( char ch, int n )
{

    for( int j = 0; j < n; j++ )
        cout << ch;

    cout << endl << text << endl;
    for( int j = 0; j < n; j++ )
        cout << ch;

}

//---------------------------------------------------------------------------

#pragma argsused
void main()
{

    fancy_text ft1;

    ft1.set_text( "Gone with the Wind" );

    ft1.box_display();
    cout << endl << endl;

    ft1.box_display( '=' );
    cout << endl << endl;

    ft1.box_display( '=', 18 );

    getch();

}

//---------------------------------------------------------------------------
(결과)
----------------------------------------
Gone with the Wind
----------------------------------------

========================================
Gone with the Wind
========================================

==================
Gone with the Wind
==================

//---------------------------------------------------------------------------
(3) static 멤버 데이타 & static 멤버 함수 - static 멤버 데이타 Class 전체에서 하나만 존재하는 멤버 데이타이다. Class 안에서 선언하고 Class 밖에서 정의한다. class aclass { private: static int star; // 선언 ... }; int aclass::star = 55; // 정의 - static 멤버 함수 static 멤버 함수에 대한 호출은 특정 객체를 참조하지 않고 이루어진다. (Scope연산자(::)로 Class 이름에 연결된 것을 보고 구별할 수 있다.) static 멤버 함수는 해당 Class의 static이 아닌 멤버 데이타를 참조할 수 없다. (static 멤버 함수는 Class의 객체에 대해 아무것도 모르며, 접근할 수 있는 것 또한 static 멤버 데이타뿐이다.) static 함수는 Class의 객체를 만들기 전에도 호출할 수 있다. static이 아닌 함수는 static 데이타에 접근할 수 있지만, static 함수는 static이 아닌 함수에 접근할 수 없다. class aclass { private: .... public: static int stafunc() { // 정의 // static 멤버 데이타에만 접근 가능 } }; main() { ... aclass::stafunc(); // 함수 호출 ... }
//---------------------------------------------------------------------------]
// 작성일 : 2001.08.21
// 제  목 : static 멤버 데이타 & static 멤버 함수
// 작성자 : 남병철
//---------------------------------------------------------------------------

#include 
#include 
#pragma hdrstop

//---------------------------------------------------------------------------

class widget
{
private:
    int widget_number;
    static int total_widgets;           // 선언

public:
    widget() {
        widget_number = 10000 + total_widgets++;
    }

    int get_number() {
        return widget_number;
    }

    static int get_total() {
        return total_widgets;
    }
};

int widget::total_widgets = 0;          // 정의

//---------------------------------------------------------------------------

#pragma argsused
void main()
{

    cout << "Total widgets = " << widget::get_total() << endl;

    widget w1, w2, w3;

    cout << "w1 = " << w1.get_number() << endl;
    cout << "w2 = " << w2.get_number() << endl;
    cout << "w3 = " << w3.get_number() << endl;

    cout << "Total widgets = " << widget::get_total() << endl;

    getch();

}

//---------------------------------------------------------------------------

(결과)
Total widgets = 0
w1 = 10000
w2 = 10001
w3 = 10002
Total widgets = 3

//---------------------------------------------------------------------------
(4) 참조 참조란? 같은변수의 또 다른 이름이다. 참조가 포인터보다 좋은점은 해제할 필요가 없기 때문에 표기법이 더 단순하고 컴파일러가 참조의 초기화를 강요하므로 골치아픈 포인터 실수를 범할 우려가 적다. 한편, 참조는 포인터보다 더 사용하기 쉽고 더 안전하지만 더 강력하지는 않다. - 함수 인수 참조로 전달 Ex) void swap( int&, int& ); // 선언 void swap( int& a, int& b ) // 정의 { ... } swap( alpha, beta ); // 호출 - 독립형 참조 참조 변수를 만들때에는 반드시 초기화 해야 한다. Ex) int iCount = 7; int& iRef = iCount; // iCount의 참조를 생성 - 참조로 리턴 om1.getnset() = 92; 이건 무엇을 의미하는 것일까? 미리 설명하자면 om1객체의 멤버 데이타 data의 값을 92로 바꾸는 역할을 하는 코드이다. 이것이 가능하려면 2가지를 지켜야 한다. 1. 멤버 함수 getnset()은 참조로 리턴을 정의해야 한다. Ex) int& getnset() {} 2. 함수 내부에서는 설정하고자 하는 변수를 리턴해 주어야 한다. (물론 리턴되는 변수는 리턴 후에도 살아있어야 한다.) Ex) return data;
//---------------------------------------------------------------------------
// 작성일 : 2001.08.21
// 제  목 : 참조
// 작성자 : 남병철
//---------------------------------------------------------------------------

#include 
#include 
#pragma hdrstop

//---------------------------------------------------------------------------

class omega
{
private:
    int data;

public:
    int& getnset()
    {
        return data;
    }
};

//---------------------------------------------------------------------------

#pragma argsused
void main()
{

    omega om1;

    om1.getnset() = 92;

    cout << "om1 = " << om1.getnset();

    getch();

}

//---------------------------------------------------------------------------

(결과)
om1 = 92

//---------------------------------------------------------------------------

+ -

관련 글 리스트
31 (02) Overload in C++ (1) 남병철.레조 9160 2009/06/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.