본문 바로가기

Programming/C++124

연산자 오버로딩 2 대입 연산자의 오버로딩은 클래스 정의에 있어서 생성자, 복사 생성자와 하께 빠질 수 없는 요소입니다. 객체간 대입연산의 비밀: 디폴트 대입 연산자정의하지 않으면 디폴트 복사 생성자가 삽입됩니다. 디폴트 복사 생성자는 멤버 대 멤버의 복사를 진행합니다. 생성자 내에서 동적 할당을 한다면, 깊은 복사가 필요하다면 직접 정의해야 합니다. 정의하지 않으면 디폴트 대입 연산자가 삽입됩니다. 디폴트 대입 연산자는 메버 대 멤버의 복사(얕은 복사)를 진행합니다. 연산자 내에서 동적 할당을 한다면, 깊은 복사가 필요하다면 직접 정의해야 합니다. pos2도, 그리고 pos1도 이미 생성 및 초기화가 진행된 객체라는 사실입니다. #pragma warning(disable:4996) #include using namespa.. 2017. 8. 1.
OOP 단계별 프로젝트 7단계 단계별 프로젝트를 진행하기에 앞서 하나의 파일을 여러 개로 나눠서 내용을 정리할 필요가 있습니다. 하나의 파일 안에 모든 것이 다들어있어서 내용파악이 쉽지 않기 때문입니다. 각각의 클래스마다 선언은 헤더파일에 정의는 시플플파일에 저장하는 것이 좋습니다. 이렇게 하면 프로그램을 관리하기도 좋고, 또 클래스의 구성이 한눈에 들어오기 때문에 프로그램의 내용을 파악하기도 수월해지기 때문입니다. 짧은 프로그램이라 할지라도 하나의 파일에 필요한 모든 요소를 담는 것은 바람직하지 못합니다. NormalAccount 클래스와 HighCreditAccount 클래스는 크기가 작은 관계로 멤버함수의 정의를 별도의 파일에 분리하지 않고 헤더파일에 모두 삽입하는 형태로 파일을 분합합니다. #pragma warning(disa.. 2017. 8. 1.
가상함수 가상함수의 선언은 virtual 키워드의 선언을 통해서 이뤄집니다. 이 함수를 오버라이딩 하는 함수도 가상함수가 됩니다. #include using namespace std; class First{public:virtual void MyFunc() { cout 2017. 8. 1.
상속과 다형성 객체지향에서 가장 중요하다고 할 수 있는 다형성을 공부할 때 입니다. 객체 포인터의 참조 관계Person * ptr;ptr=new Person();위의 두 문장이 실행되면, 포인터 ptr은 Person 객체를 가리키게 됩니다. 그런데 Person형 포인터는 Person 객체뿐만 아니라, Person을 상속하는 유도 클래스의 객체도 가리킬 수 있습니다. C++ 에서, AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다. 객체의 주소 값을 저장할 수 있다. #pragma warning(disable:4996) #include using namespace std; class Person{public:void Sleep() { cout 2017. 7. 31.
상속(Inheritance)의 이해 객체지향이 지니는 이점은 모델링에 근거를 둡니다. 기존에 정의해 놓은 클래스의 재활용을 목적으로 만들어진 문법적 요소가 상속이다. #pragma warning(disable:4996)#include #include using namespace std; class PermanentWorker{private:char name[100];int salary;public:PermanentWorker(char* name, int money):salary(money){strcpy(this->name, name);}int GetPay() const{return salary;}void ShowSalaryInfo() const{cout 2017. 7. 31.
friend 와 static 그리고 const const 객체와 const 객체의 특성들다음과 같이 변수를 상수화 하듯이, const int num=10; 다음과 같이 객체를 상수화할 수 있습니다. const SoSimple sim(20); 이 객체를 대상으로는 const 멤버함수만 호출이 가능하다. 이는 객체의 const 선언이 다음의 의미를 갖기 때문입니다. 이 객체의 데이터 변경을 허용하지 않겠습니다. 때문에 const 멤버함수의 호출만 허용하는 것입니다. 변경시킬 능력이 있는 함수는 아예 호출을 허용하지 않는 것입니다. #include using namespace std; class SoSimple{private:int num;public:SoSimple(int n) : num(n){ }SoSimple& AddNum(int n){num += .. 2017. 7. 31.
복사 생성자(Copy Constructor) 복사 생성자가 생소하긴 해도 생성자의 한 형태일 뿐입니다. 우리는 지금까지 다음과 같은 방식으로 변수와 참조자를 선언 및 오기화해 왔습니다. int num=20; int &ref=num; 하지만 C++에서 다음의 방식으로 선언 및 초기화가 가능합니다. int num(20); int &ref(num); 위의 두 가지 초기화 방식은 결과적으로 동일합니다. C++ 의 모든 객체는 생성자의 호출을 동반한다고 했는데, sim2의 생성자 호출에 대해서는 언급한 바가 없습니다. 과연 sim2는 어떠한 과정을 거쳐서 생성되는 것일까요? SoSimple sim2(sim1); 이 문장에 담겨있는 내용을 정리하면 다음과 같습니다. SoSimple형 객체를 생성합니다. 객체의 이름은 sim2로 정합니다. sim1을 인자로 받.. 2017. 7. 31.
생성자와 소멸자 이전 포스팅에서 객체를 생성하고 객체의 멤버변수 초기화를 목적으로 함수를 정의하고 호출하였습니다. 정보은닉을 목적으로 멤버변수들을 private 으로 선언했습니다. 생성자라는 것을 이용하면 객체도 생성과 동시에 초기화할 수 있습니다. 생성자의 이해클래스의 이름과 함수의 이름이 동일합니다. 반환형이 선언되어 있지 않으며, 실제로 반환하지 않습니다. 이러한 유형이 함수를 가르켜 생성자라고 합니다. 객체 생성시 딱 한번 호출된다는 특징을 가지고 있습니다. 이전에 생성자를 정의하지 않았을 때, 우리는 다음과 같은 방식으로 객체를 생성하였습니다. SimpleClass sc;SimpleClass * ptr = new SimpleClass;생성자가 정의되었으니, 객체생성과정에서 자동으로 호출되는 생성자에게 전달할 인.. 2017. 7. 31.
클래스의 완성 객체지향의 중요 요소인 정보은닉과 캡슐화에 대해 이야기하겠습니다. 정보은닉우리는 객체의 생성을 목적으로 클래스를 디자인합니다. 좋은 클래스가 되기 위한 조건으로는 어떤 것이 있을까요? 여기에는 정보은닉과 캡슐화가 있습니다. #pragma warning(disable:4996) #includeusing namespace std; class Point{public:int x;int y;}; class Rectangle{public:Point upLeft;Point lowRight;public:void ShowRecInfo(){cout 2017. 7. 28.
클래스의 기본 구조체가 주는 이점은 연관있는 데이터를 하나로 묶으면, 프로그램의 구현 및 관리가 용이하다는 점입니다. 소프트웨어를 단순하게 표현하면 데이터의 표현과 데이터의 처리입니다. 표현해야 하는 데이터는 항상 부류를 형성하기 마련입니다. 이렇게 부류를 형성하는 대이터들은 함께 생성, 이동 및 소멸된다는 특성이 있습니다. 구조체는 연관 있는 데이터를 묶을 수 있는 문법적 자잋로 데이터의 표현에 매우 큰 도움을 줍니다. struct car basicCar; 삽입된 키워드 struct는 이어서 선언되는 자료형이 구조체를 기반으로 정의된 자료형임을 나타냅니다. 키워드 struct를 생략하려면 별도의 typedef 선언을 추가해야 합니다. C++ 에서는 별도의 typedef 선언 없이도 다음과 같이 변수를 선언할 수 있습.. 2017. 7. 28.