반응형

c++ 33

[C++] 가상함수의 사용

클래스의 상속관계에서 부모의 함수를 오버라이딩 하여 사용할 때가 있습니다. 만약 그 함수의 객체를 포인터로 만들었을 때 문제가 생길 수 있습니다. 다음의 코드를 보면서 이해해 보겠습니다. class First { public: void SimpleFunc() { cout ptr2 ( ptr3 -> Third 클래스 ) 가 됩니다. 하지만 SimpleFunc() 함수는 각각 생성된 클래스에 있는 함수가 불러와졌습니다. 문제없이 출력이 된것처럼 보이지만 사실 논리상 맞지 않습니다. 이러한 로직 에러를 방지하기 위해 C++에 있는 개념이 가상함수입니다. 예를 통해서 가상함수에 사용을 확인해 보겠습니다. class First { public: virtual void SimpleFunc() { cout

[C++] 객체 포인터의 참조관계

객체 포인터 변수란, 객체의 주소 값을 저장하는 포인터 변수이다. 포인터 변수 선언과 객체 참조 방법 class Person { }; class Student : public Person { }; int main() { Person* ptr; ptr = new Person(); } 그런데 Person형 포인터느느 Person 객체뿐만 아니라, Person을 상속하는 유도 클래스( 즉, 자식 클래스) 또한 가리킬 수 있다. class Person { }; class Student : public Person { }; int main() { Person* ptr; ptr = new Student(); } 그리고 Student 클래스를 부모 클래스로 둔 ParttimeStudent 클래스가 있다고 하고 그 클..

[C++] 상속의 문법적인 이해

상속이란? 흔히 상속이라 하면 부모가 자식에게 무언가를 물려줄 때 많이 사용한다. 프로그래밍에서 상속이란 프로그램에 확장성을 위해 코드에 변경을 줄이면서 비슷한 기능을 하는 여려개의 클래스들에 관계를 나타낼 때 사용합니다. #include #include #pragma warning(disable:4996) using namespace std; class Person { int age; char name[50]; public: Person(int my_age,const char* my_name) : age(my_age) { strcpy_s(name, my_name); } void WhatYourName() { cout

[C++] 복사 생성자의 호출 시점

복사 생성자가 호출되는 세 가지 시점에 대해서 정리해 보겠습니다. 1. 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우 2. Call - by - value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우 3. 객체를 반환하되, 참조형으로 반환하지 않는 경우 using namespace std; class Easy { private: int num; public: Easy(int n) : num(n) {} Easy(const Easy& copy) : num(copy.num) { cout

'깊은 복사'와 '얕은 복사'

이 전 글에 디폴트 복사 생성자에 대해서 이야기했다. 멤버 대 멤버에 의한 복사로 '얕은 복사 (shallow copy)라고 한다. 이는 멤버변수가 힙의 메모리 공간을 참조하는 경우에 문제가 됩니다. 얕은 복사에 문제점에 대해서 먼저 이야기 하겠습니다. #include #include #pragma warning(disable:4996) using namespace std; class Person { char* name; int age; public: /*Person() { name = NULL; age = 0; cout name, copy.name); strcpy(this->compeny_name, copy.compeny_name); strcpy(this->phone_number, copy.phone_..

[C++] 디폴트 복사 생성자

복사 생성자에 대해 이야기하기 전에 C++ 스타일에 독특한 초기화 방식을 먼저 보겠습니다. int n = 20; int &nref = n; int s(30); int &sref(s); 위에 두 문장과 아래 두 문장은 동일한 기능을 수행합니다. 이 전 블로그에 멤버 이니셜라이저에 대해 이야기했는데 멤버 이니셜라이저 과정에서 위에 형태를 찾아볼 수 있습니다. 이어서 다음의 코드를 보겠습니다. int main() { Simple sim1(15,20); Simple sim2 = sim1; sim2.SHowSimpledata(); } Simple 클래스에 인자값을 2개를 받는 생성자를 만들었다고 가정해 보면, sim1이라는 객체는 생성과 동시에 인자값을 전달하며 생성자를 호출하였습니다. 하지만 sim2 객체는 생..

[C++] 객체 배열과 포인터 배열

객체 기반의 배열 선언은 다음과 같다. Person arr[10]; 이를 동적으로 할당하는 경우에는 다음의 형태로 선언한다. Person *ptrArr = new Person[10]; 이렇게 배열을 선언한 경우에도 생성자는 호출이 된다. 하지만 선언 과정에서 호출할 생성자를 별도로 명시하지 못한다. 즉, 생성자에 인자값을 전달하지 못한다. 배열에 선언과정에서 각가의 요소를 원하는 값으로 초기화시키길 원한다면, 일일이 초기화 과정을 별도로 해줘야 한다. #include #include #pragma warning(disable:4996) using namespace std; class Person { char* name; int age; public: Person() { name = NULL; age = ..

[C++] 생성자 (Constructor)

생성자를 생성하면 객체를 생성함과 동시에 초기화할 수 있다. #include using namespace std; class SimpleClass { private: int num; public: SimpleClass(int n)// 생성자 (constructor) { num = n; } int GetNum() const { return num; } }; int main() { SimpleClass *Simple = new Simple(23); } 생성자의 특징은 다음과 같다. - 클래스의 이름과 함수의 이름이 동일하다. - 반환형이 선언되지 않으며, 실제로 반환하지 않는다. main() 함수 안에서 동적할당 시 객체 생성과 동시에 생성자를 초기화하는 법을 보여준다. 생성자의 활용으로는 - 생성자도 함수..

반응형