목록Tutorials/C++ : Beginner (46)
KoreanFoodie's Study
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 다운캐스팅 이전 글에서 사용했던 Base 클래스와 Derived 클래스를 약간 변형해 보자. #include #include class Base { std::string s; public: Base() : s("기반") { std::cout
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 표준 String 클래스 C++에서 문자열을 표현할 때는 char[ ]이 아닌, 표준 String 클래스를 사용하자. 상속 직원을 관리하는 EmployeeList와 Employee class를 만들었다고 가정해 보자. class Employee { std::string name; int age; std::string position; int rank; public: Employee(std::string name, int age, std::string position, int rank) : name(name), age(age), position(position), rank(rank) ..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! C++ 스타일의 캐스팅 기존의 C 언어에서는 컴파일러가 알아서 캐스팅하는 암시적(implicit) 캐스팅과, 프로그래머가 직접 캐스팅하라고 지정하는 명시적(explicit) 캐스팅이 있었다. 하지만 C++에서는 다음과 같은 4가지의 캐스팅을 제공하고 있다. 1. static_cast : 우리가 흔히 생각하는, 언어적 차원에서 지원하는 일반적인 타입 변환 2. const_cast : 객체의 상수성(const)를 없애는 타입 변환. 쉽게 말해 const int가 int로 바뀐다. 3. dynamic_cast : 파생 클래스 사이에서의 다운캐스팅 4. reinterpret_cast : 위..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! friend 키워드 클래스 내부에서 다른 클래스나 함수들을 friend로 정의할 수 있는데, friend로 정의된 클래스나 함수들은 원래 클래스의 private로 정의된 변수나 함수들에 접근할 수 있다. class A { private: void DoSth() {}; int a; friend class B; friend void func(); } class B { public: void b() { A a; a.DoSth(); a.a = 1; } } void func() { A aa; aa.a= 2; a.DoSth(); } 위에서 friend로 지정된 클래스 B와 함수 func( )는..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! MyString의 '==' 연산자 오버로딩 이미 MyString class에서 compare함수를 만들었다면, 연산자 오버로딩은 간단히 구현할 수 있다. bool MyString::operator==(const MyString& str) { return !compare(str); } 대입 연산자 함수 복소수를 구현한 Complex 클래스에서 '=' 연산자 함수를 구현한다고 해 보자. Complex& Complex::operator=(const Complex& c) { real = c.real; img = c.img; return *this; } 왜 참조자(Complex &)로 값을 ..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! explicit 키워드 explicit 키워드는, 간단히 말해 암시적 형 변환을 허용하지 않을 때 붙여주는 키워드이다. 예를 들어, 이전에 만들었던 MyString 클래스에 다음과 같은 생성자와 함수를 추가한다고 가정해 보자. MyString::MyString(int capacity) { string_length = 0; string_content = new char[capacity]; memory_capacity = capacity; } void MyString::DoSomething(MyString s) {}; 만약, explicit이 없다면, 다음과 같은 호출은 정상적으로 작동..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 문자열 클래스 기존 C언어에서는 문자열의 마지막에 널 값('\0')을 삽입했다. C++에서는 표준 라이브러리로 string 클래스를 제공하고 있으므로, char* 대신 string을 사용하자! 직접 String Class를 만들어 보는 것은 좋은 연습이 된다. 필요 명세는 다음과 같다. 변수 : 문자열 길이, 문자열 내용, 사용하는 메모리 크기 메소드 : 생성자, 소멸자, insert, erase, find, reserve, assign, compare 더보기에 예제 코드를 넣어 놓았다. 더보기 모두의 코드에서 제시한 MyString 클래스 코드 예시 : #include // str..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 생성자의 초기화 리스트(initializer list) 간단한 예시 코드를 보자. class Test { int a; int b; Test(); } Test::Test() : a(1), b(2) {} 위의 예시에서, (생성자 이름) : var1(arg1), var2(arg2) ... 같은 형식을 써 주면, 생성자 호출과 동시에 멤버 변수들을 초기화해줄 수 있다. "동시에"라는 개념이 중요하다. 초기화 리스트를 사용하지 않으면 생성을 먼저 하고 그 다음에 대입을 수행하게 된다. 따라서, 초기화 리스트는 int a = 10; 와 같고, 일반 버전의 생성자는 int a; a = 10; 처..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 소멸자 클래스 생성자에서 만들어 준 자원은 객체가 소멸할 때 반드시 해제되어야 메모리 누수(memory leak)이 일어나지 않는다. #include class Marine { char* name; public: Marine(); Marine(const char* marine_name); ~Marine(); }; Marine::Marine() { name = NULL; } Marine::Marine(const char* marine_name) { name = new char[strlen(marine_name) + 1]; strcpy(name, marine_name); } Marine..
함수의 오버로딩 (function overloading) 함수의 오버로딩은, 인자로 들어오는 변수의 타입에 따라 이름이 같은 함수들 중 적합한 함수를 호출해 주는 것을 의미한다. 이때, 인자를 찾는 과정은 다음과 같다. 1 단계 : 자신과 타입이 일치하는 함수를 찾는다. 2단계 : 정확히 일치하는 타입이 없는 경우, 아래와 같은 형변환을 통해 일치하는 함수를 찾는다. Char, unsigned char, short 는 int로 변환된다. Unsinged Short는 int의 크기에 따라 int 혹은 unsigned int로 변환된다. Float는 double로 변환된다. Enum은 int로 변환된다. 3단계 : 위와 같이 변환해도 일치하는 것이 없다면 아래의 좀 더 포괄적인 형변환이 일어난다. 임의의 숫..