본문 바로가기
  • 쓸쓸한 개발자의 공부방

전체 글49

[C++] Explicit 생성자 Explicit 생성자 explicit a. 명백한, 뚜렷한(clear), 명시적인 - 직접 초기화 (direct initialization) : OFile fi("a.txt");와 같이 '=' 없이 초기화 하는 것 - 복사 초기화 (copy initialization) : OFile f2 = "a.txt"; 와 같이 '=' 사용해서 초기화 하는 것 함수 인자 전달시 복사 초기화를 사용한다. foo("hello")를 보낸다는 것은 hello 이름으로 File이 error 없이 생성이 된다. 특정 클래스 설계시 복사 초기화를 사용하지 못하게 하는 것이 좋을 때가 있다. #include class OFile { FILE* file; public: OFile(const char* filename) { file.. 2021. 8. 20.
[C++] Class : 멤버 초기화 리스트 (member initializer lists) 멤버 초기화 리스트 (member initializer lists) 생성자 괄호 ( ) 뒤에 콜론 (:) 을 표기하고 멤버를 초기화 하는 것 Point( int a, int b) : x(a), y(b) { } 대입 방식이 아닌 초기화 방식이다. 멤버 초기화 리스트를 사용하는 방향이 성능면에서 더 좋다. 클래스 선언부 구현부가 분리되어 있을 때, 초기화 리스트는 구현부에 작성한다. #include class Point { int x; int y; public: Point( int a, int b) : x(a), y(b) // 초기화 { // x = a; // 대입 // y = b; } }; int main() { Point p(1, 2); int a = 0; // 초기화. 생성자 호출 int b; // 생.. 2021. 8. 19.
[C++] 생성자, 소멸자, 위임 생성자, default 생성자 생성자 (constructor)와 소멸자 (destructor) "생성자 (constructor)" 생성자를 사용하는 이유 - 객체를 자동으로 초기화 하기 위해서 생성자 모양 - 클래스 이름과 동일한 함수 - 리턴 타입이 없다. - 인자는 있어도 되고 없어도 된다. 2개 이상 만들 수 있다. 객체를 생성하면 - 객체의 크기 만큼 메모리를 할당 - 생성자가 호출된다 - 생성자가 없으면 객체를 만들 수 없다. 디폴트 생성자 - 사용자가 생성자를 한 개도 만들지 않으면 디폴드 생성자를 컴파일러가 인자없는 생성자를 제공해 준다. #include using namespace std; class Point { int x, y; public: Point() { x = 0; y = 0; cout 2021. 8. 19.
[C++] 객체지향 : 접근지정자 private, public, friend 접근지정자 private / public - 사용자는 내부 멤버 데이터 구조에 대해 굳이 알 필요가 없다. - 멤버 함수를 통해서만 객체 상태 변경이 가능하도록 해서 객체를 안전하게 유지한다. 이를 캡슐화라 말한다. - setter / getter : 멤버 데이터 접근을 위해 함드는 함수를 나타내는 용어, private 멤버 데이타를 선언하고 setter/getter로 접근하는 것이 일반적 자전거의 기어는 현실 세계에서 항상 존재함. 프로그램에서 잘못된 기어 생성을 막아야 한다. gear의 값이 마이너스 값이거나 0 인 경우는 값 셋팅이 되지 않도록 하는 조건을 만들어 넣을 수 있다. #include class Bike { public: void changeGear(int n) { if ( n < 1 ).. 2021. 8. 18.
[C++] STL : stack, vector 다양한 STL 이 있지만 그 중 가장 많이 자주 사용하는 stack과 vector를 살펴 보겠습니다.! STL - stack STL (Standard Template Library) 은 C++에서 제공하는 표준 라이브러리 #include #include // stack 사용을 위해 해당 header추가 해야함. int main() { std::stack s; // 클래스 탬플릿으로 되어 있어 input type을 적어줘야 함. s.push(10); s.push(20); s.push(30); std::cout 2021. 8. 17.
[C++] 객체 지향 프로그래밍 OOP 객체 지향 프로그래밍 OOP 개념 OOP : Objected Oriented Programming 복소수를 표현하기 위해 double형 변수 2개를 사용 날짜를 표현하기 위해 int형 변수 3개 를 사용 사람을 표현하기 위해 이름, 나이 등의 변수들을 사용 아래와 같이 복소수 계산을 위해 input 6개를 넣어주는 함수를 만드는데 복잡하고 번거롭다. 객체 지향 프로그래밍 관점에서 Complex, Date, Person 와 같은 객체를 만들어 표현하고 싶다. // 복소수 2개를 더하고 싶다. void add( double ar, double ai, double br, double bi, // 계산에 필요한 변수 4개 (in parameter) double* sr, double* si ) // 결과 값을 담.. 2021. 8. 16.
[C++] 동적메모리 할당 (new, delete), nullptr new / delete C언어에서 메모리 할당할 때 malloc을 사용한다. 해제할 때는 free를 사용한다. C언어에서는 malloc사용시 캐스팅이 필요없다. C++에서 malloc 사용 가능하다. 그러나 반환되는 주소는 원하는 포인터 타입으로 캐스팅 해야 한다. #include int main() { int* p1 = (int*)malloc(sizeof(int)*10); // malloc 사용시 c에서는 (int*) 캐스팅 없이 사용가능하지만 // c++에서는 (int*)와 같은 캐스팅이 필요하다. free(p1); } C언어에서의 동적 메모리 할당 - new로 할당하고 delete로 해지한다. - new가 반환한 주소를 캐스팅 할 필요가 없다. - 배열 형태로 할당한 경우 delete[]로 해지 해.. 2021. 8. 15.
[C++] Explicit Casting (명시적 캐스팅) C++ Explicit Casting (C++ 명시적 캐스팅) C의 캐스팅이 논리적이지 않고, 위험성이 있으며, 버그 가능성이 높다. 그래서 C++에서는 새로운 캐스팅 방법을 소개하고 있다. C언어의 캐스팅 방법 : int* p1 = (int*)malloc(sizeof(int)*10); // C언어의 캐스팅 방법 : C++에서도 사용은 가능하다. C++의 캐스팅 방법 : #include #include int main() { int* p1 = static_cast(malloc(sizeof(int)*10)); // C++ 에서 사용하는 캐스팅 방법 free(p1); } C언어 방식의 캐스팅의 단점 : 아래 두 가지 경우가 대표적인 c언어에서 발생할 수 있는 캐스팅 문제이다. 단점 예제 (1) : #incl.. 2021. 8. 14.
[C++] const reference, return by reference const reference call by value - 인자로 전달된 객체의 복사본이 생성된다. 원본 객체를 변경할 수 없기에 안전하지만 복사본에 대한 오버헤드가 있다. call by reference with const void foo (const Data& d) 복사본에 대한 오버헤드를 없애고, 안전하게 값을 사용하게 하기 위해서 const reference를 사용할 수 있다. 또한 복사 생성자와 소멸자가 호출되지 않는다. #include struct Date { int year; int month; int day; }; //void foo(Date d) // call by value void foo(const Date& d) // const reference : 안전하게 값을 넘겨 사용이 가능하다.. 2021. 8. 14.
[C++] reference 개념 c++ reference 개념 아주 기본 개념이지만 완벽하게 이해하지 않고 개발하려면 매우 혼란스럽다. reference 개념을 확실하게 이해해야 한다. c에서는 pointer의 개념, 주소의 개념이 정말 중요했다면, 추가로 c++에서는 reference 개념을 정확히 이해해야 한다. 변수 - 메모리의 특정 위치를 가리키는 이름이다. - 코드 안에서 해당 메모리에 접근하기 위해서 사용한다. 레퍼런스 - 기존 변수(메모리)에 또 다른 이름(alias)를 부여하는 것 - 아래 코드에서 n이 기존 변수 이며, r이 새로운 reference 변수 이름이다. #include int main() { int n = 10; n = 20; //int* p = &n; // 포인터 변수에서 주소를 꺼내는 방법 int& r .. 2021. 8. 13.