2014. 11. 24. 14:29

C컴파일러와, C++컴파일러가 호출하고자 하는 함수를 찾을때 참조하는 정보가 다르기 때문이다!!


* C 컴파일러 ( 함수 오버로딩 x )

 함수의 이름

C컴파일러는 호출하고자 하는 함수를 찾을 때 오로지 함수의 이름 정보만을 갖고 찾기 때문에 정의된 매개 변수의 형태가 달라도 동일한 이름의 함수 정의는 허용하지 않는다.


#overC.c

  1 #include <stdio.h>

  2

  3 int function(void)

  4 {

  5     return 0;

  6 }

  7 int function(int a, int b)

  8 {

  9     return a+b;

 10 }

 11

 12 int main()

 13 {

 14     function();

 15     function(1,2);

 16     return 0;

 17 }


$ gcc overC.c

overC.c:7: error: conflicting types for ‘function’

overC.c:3: note: previous definition of ‘function’ was here

overC.c: In function ‘main’:

overC.c:14: error: too few arguments to function ‘function’





* C++ 컴파일러 ( 함수 오버로딩O)

  함수의 이름 + 매개 변수의 정보

C++컴파일러는 호출하고자 하는 함수를 찾을 때 함수의 이름뿐만 아니라 매개 변수의 정보까지도 참조를 한다. 

즉 C++은 이름이 같고 매개 변수의 타입 혹은 개수가 다른 함수들의 정의를 허용한다.

 => 이를 함수 오버로딩이라고 한다!

#include <iostream>


int function(void)

{

    return 0;

}

int function(int a, int b)

{

    return a+b;

}


int main()

{

    function();

    function(1,2);

    return 0;

}

$ g++ -o overCPP overCPP.cpp

문제없이 동작한다.


출처 : 열혈강의 C++프로그래밍(윤성우저) 참고

Posted by Triany
2014. 6. 20. 14:56

# 전역 함수에 대한 friend 선언

friend 선언을 통해서 private로 선언된 멤버 변수의 접근을 허용


#include <iostream>


using std::endl;

using std::cout;


class Counter

{

    int val;

public:

    Counter()

    {

        val = 0;

    }

    void Print() const

    {

        cout << val << endl;

    }


    friend void SetX(Counter &c, int val); //friend선언


};

void SetX(Counter &c, int val)

{

    c.val = val; //private로 선언된 멤버 변수 접근

}




int main()

{

    Counter cnt;

    cnt.Print();


    SetX(cnt, 2002);

    cnt.Print();

    return 0;

}


$ 4-6-1

0

2002



출처 : 윤성우의 c++프로그래밍(열혈강의)

Posted by Triany
2014. 6. 20. 14:46

함수가 클래스의 멤버함수인 경우,

 const키워드를 뒤에 삽입가능한데,

이경우 함수에 속해있는 객체의 멤버변수를 변경할 수 없다.


#include <iostream>


using std::endl;

using std::cout;


class Counter

{

    int val;

public:

    Counter()

    {

        val = 0;

    }

    void Print() const

    {

        val = 1; //Error

        ocut << val << endl;

    }


};



int main()

{

    Counter cnt;

    cnt.Print();


    return 0;

}

$ gcc.sh 4-6-1.cpp

4-6-1.cpp: In member function ‘void Counter::Print() const’:

4-6-1.cpp:16: error: assignment of data-member ‘Counter::val’ in read-only structure

4-6-1.cpp:17: error: ‘ocut’ was not declared in this scope



Posted by Triany