목록2022/05/15 (5)
Brise
C++ 은 C가 아니다. C++와 C는 거의 호환되는 것처럼 보이지만, 실제로는 다르게 동작하고 있다. C++에서는 C에서 지원하지 않는 다형성과 같은 특징을 지원하고 있으며, 이를 위해서 mangling이라는 구조를 도입하여 여러 함수들과의 충돌을 방지하고 있다. mangling 방법은 컴파일러별로 상이하다. // 9_mangling // C 로 컴파일 하면 : 함수이름 Add(gcc), _Add(vc) // C++로 컴파일 하면 : ?Add@XXYYH@Z(VC++), ??(g++) // name mangling : C++ 컴파일러가 함수이름을 변경하는 것 // => 함수 오버로딩 때문에 Add 함수가 여러개 일수 있으므로 int Add(int a, int b) { return a + b; } int ..
C++의 다형성과 같은 특징들은 컴파일 시간에 호출할 함수가 정해진다는 특성이 있다. 만약 여러 클래스에 대해서 같은 함수를 만들고, 기반 클래스의 함수 포인터를 이용하여 핸들링하게 되는 경우 기반 클래스에 있는 함수를 호출하게 된다.(컴파일 시간에 기반 클래스의 함수로 바인딩 되기 때문에) 기반 클래스의 함수를 호출하면서 동작은 실제 클래스별로 다르게 동작시키고 싶은 경우 함수 호출에 따라 실제 사용할 함수를 동적으로 결정하여야 하며, 이 때 가상함수(virtual function) 을 사용하여야 한다. // 7_가상함수1 144 page ~ #include class Animal { public: virtual void Cry() { std::cout Cry() 를 어떤 함수로 연결할것인가 ? // ..
파생클래스 포인터를 기반클래스 포인터로 캐스팅하여 사용하는 것을 업캐스팅이라 한다. 업캐스팅을 이용하면 여러 종류의 클래스를 하나의 코드로 운용 가능하다는 장점이 있다. // 6_Upcasting1.cpp 140 page ~ #include class Animal { public: int age; }; class Dog : public Animal { public: int color; }; int main() { Dog dog; Dog* p1 = &dog; // ok Animal* p2 = &dog; // ok. 파생클래스의 주소를 // 기반 클래스 타입의 포인터에 담을수있다 //p2->color = 10; // error. Animal* 로는 Animal의 멤버만 // 접근 가능하다. static_ca..
상속은 객체지향언어에서 가장 중요한 개념중에 하나이다. 상속을 통하여 코드 재활용성의 가능성을 높일 수 있다. C++에서는 상속을 위하여 클래스 뒤에 상속받는 클래스의 이름을 콜론(:)으로 분리하여 명시한다. // 5_상속1.cpp 132page ~ #include #include class People { std::string name; int age; }; class Student : public People // 상속 ( inheritance ) { int id; }; class Professor : public People { int major; }; int main() { } private 지시어로 붙은 멤버 변수의 경우 파생 클래스에서도 접근이 불가능하다. // 5_상속2 class Base ..
상수멤버함수는 실행시 모든 멤버 값들을 상수로 취급하는 함수이다. 잘 생각해보면 c언어에서 const struct 가 있듯이 c++언어에서는 const class가 있으며, 거기에다가 객체 지향 언어이므로 const class에서 사용할 수 있는 함수가 있어야 한다. // 4_상수멤버함수1.cpp 119 page ~ #include class Point { public: int x, y; Point(int a = 0, int b = 0) : x(a), y(b) {} void set(int a, int b) { x = a; y = b; } void print() const // 상수 멤버 함수 { // 상수 멤버 함수 안에서는 모든 멤버를 상수 취급 합니다 // x = 100; // error std::c..