반응형 프로그래밍 언어/C++80 [C++] ADL (Argument Dependent Lookup) ADL (Argument Dependent Lookup)• 함수 검색할 때 인자가 포함된 namespace는 자동으로 검색에 포함! • Koening Lookup 라고도 부름#include namespace Harbang{ class Point {}; void draw(const Point& p) { printf("draw..\n"); }}int main(){ Harbang::Point pt; Harbang::draw(pt); // ok draw(pt); // ?? -> ok (ADL)}Harbang Namespace 없이도 draw() 호출 가능 이는 ADL로 Point가 포함된 namespace 검색하였기 때문. Q) namespace 명시하게 하면 분명하고 좋은데 굳이 ADL 기능이 있는 이유는?.. 2025. 3. 9. [C++] 대입 연산자 재정의 (Assignment Operator) 대입 연산자• 사용자가 만들지 않으면 컴파일러가 기본 구현 제공 (모든 멤버 복사)• 멤버 함수로만 만들 수 있다. [예제] 복사 생성자: 객체 생성할 때 초기화 하는 것 대입 연산자: 객체를 생성 후에 값을 넣는 것class Point{public: int x = 0; int y = 0; Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1 { 1, 1 }; Point p2; Point p3 = p1; // 복사 생성자 p2 = p1; // 대입 연산자 p2.operator=(p1)}[예제] 대입 연산자#include class Point{public: int x{ 0 }; int y{ 0 }; Point() =.. 2025. 3. 7. [C++] 가상함수 테이블 가상 함수 테이블(vtable) 개념가상함수는 실행시간에 어떻게 타입을 조사할까? 실행시간에 해당 함수 호출하려면 함수 주소를 알아야 한다. C++ 컴파일러는 가상 함수 테이블(vtable) 을 생성하여 런타임에 올바른 함수를 찾는다. ** 가상함수 원리는 컴파일러 종류와 버전에 따라 다를 수 있다.#include using namespace std;class Base{ int d;public: virtual void f1() {} virtual void f2() {} virtual void f3() {}};class Derived : public Base{ int d;public: virtual void f2() override {}};int main(){ Base.. 2025. 3. 6. [C++] 연산자 재정의 (Operator Overloading) 연산자 재정의 (Operator Overloading)사용자 정의 타입에서 +, - 등 연산자 사용할 수 있는 문법class Point{ int x = 0; int y = 0;public: Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1{ 1, 1 }; Point p2{ 2, 2 }; Point p3 = p1 + p2; // ?? -> error}「 a + b 」 → a, b 중 「operator+」 라는 함수 호출 찾을 수 없는 경우 Error→ 「 operator+(a, b) 」 or 「 a.operator+(b) 」 「 operator+(a, b) 」 함수 인자 2개로 멤버가 아닌 함수로 구현 「 .. 2025. 3. 5. [C++] 다중 상속 (multiple inheritance) 다중 상속 (multiple inheritance)• 클래스 2개 이상의 기반 클래스 상속 하는 것• Java, C# 에서는 지원하지 않지만 C++에서는 다중 상속 지원 [예제] 다중상속class InputFile{public: void read() {}};class OutputFile{public: void write() {}};// 다중 상속class IOFile : public InputFile, public OutputFile{};int main(){ IOFile file; file.write(); file.read();} 주의사항• 서로 다른 기반 클래스에 동일 이름 멤버 있으면 충돌 주의 • Disamond 형태 상속class InputFile{public: .. 2025. 3. 4. [C++] dynamic_cast dynamic_cast• 실행시간 캐스팅 (overhead 有)• 실제 가리키는 곳 조사해서 잘못되지 않는 경우 주소 반환 → 잘못된 경우 「0」 반환• porymorphic type 에 대해서만 사용 가능 → 가상함수 없는 경우 컴파일 에러 [예제] downcastingclass Animal{public: virtual ~Animal() {}};class Dog : public Animal {};int main(){ Animal* p = new Dog; // error (암시적 형변환) Dog* pd1 = pa; // ok (명시적 형변환) Dog* pd2 = static_cast(pa);}downcasting• 기반 클래스 포인터 타입을 파생 클래스 포인터 타입으로 캐스팅 • 암시적 변환 될 수 .. 2025. 3. 3. [C++] 인터페이스(Interface) 추상 클래스 vs 인터페이스• 인터페이스: 지켜야 하는 규칙(순수 가상함수)만 가진 것• 추상클래스: 지켜야 하는 규칙 + 다른 멤버도 있는 경우 Java 등 대부분의 객체 지향 언어는 abstract, interface 별도 키워드 제공하지만 C++ 에서는 추상 클래스 문법만 존재[예제]사람들은(People)은 일반 카메라를 사용#include class People{public: void UseCamera(Camera* p) { p->Take(); }};class Camera{public: void Take() { std::cout [예제] 카메라 종류가 다양해지면 기존 UseCamera(Camera* p) 로는 모든 카메라를 담을 수 없다.#include class People{publi.. 2025. 3. 2. [C++] object Slicing object Slicing Q) vector에 파생 클래스를 담으면 어떻게 될까?#include #include using namespace std;class Shape{ int num;public: virtual void draw() { cout v; Shape s; v.push_back(s); Rect d1; v.push_back(d1); Rect d2; v.push_back(d2); for (auto i : v) { i.draw(); // ??? }} 파생 클래스 Rect 담아주었지만 Shape draw()가 호출되었다. 이는 vector에서 Shape 타입만 보관하고 있다. Q) vector와 vector 무슨 차이가 있을까?#inc.. 2025. 3. 1. [C++] RTTI (Run-Time Type Information) RTTI (Run-Time Type Information)• 실행시간에 객체 타입 조사 • 특정 조건에서는 컴파일 시간에도 조사 가능 타입 조사• typeid 연산자• dynamic_cast typeid객체 타입 정보를 std::type_info 타입의 객체 참조 반환const, volatile, refernece 제외한 타입에 결과 반환• t1 = t2• t1.hash_code() == t2.hash_code()• std::type_index(t1) == std::type_index(t2) #include #include int main(){ auto n = 10; const std::type_info& t1 = typeid(n); const std::type_info& t2 = t.. 2025. 2. 28. [C++] 가상함수와 디폴트 파라미터 가상함수와 디폴트 파라미터가상함수 override 시에는 디폴트 파라미터 값 설정 변경에 주의해야 한다. [예제] 가상함수와 디폴트 파라미터 #include class Base{public: virtual ~Base() {}; virtual void foo(int n = 10) { std::cout foo(); // ???} 가상함수 이기 때문에 파생 클래스(Dereived) 함수가 호출된다. 하지만 default parameter 는 기반 클래스(Base)로 결정되었다. 이는 디폴트 파라미터는 컴팡이러가 컴파일 시간에 값을 채우지만 가상함수는 실행시간에 결정하기 때문이다. 그렇기에 가상함수 override 시에는 디폴트 값을 변경하지 말아야 한다.📌 [C++] 가상 함수 (virtual f.. 2025. 2. 27. 이전 1 2 3 4 ··· 8 다음 반응형