프로그래밍/C++

    포르잔 C++ 바이블 ch12 연습문제 & 프로그래밍 문제

    연습 문제 1번 Base 클래스와 Base 클래스를 상속받는 Derived1과 Derived2 클래스가 있다고 합시다. 이 클래스를 다형성 관계로 활용하려고 합니다. 각 클래스에 가상 print 함수와 가상 소멸자가 있는 경우의 가상 테이블을 그림으로 표현하세요. 2번 다음과 같은 두 클래스가 있다고 합시다. 두 클래스가 다형성을 갖게 스택 메모리 위에 인스턴스화하는 코드를 작성하세요. 다형성을 활용한다는 것은 부모 클래스에 대한 포인터를 사용한다는 것입니다. 다만 객체의 실체를 스택 메모리에 만들어서 활용하라는 것이 문제의 포인트입니다. class First { private: int fr; public: First(int fr); virtual ~First(); virtual void print() ..

    포르잔 C++ 바이블 Ch.11 연습문제 & 프로그래밍 문제

    연습문제 1번 다음과 같이 2개의 클래스를 정의했을 떄, 위임(delegation)을 사용해서 두 클래스의 set 함수와 print 함수를 정의해주세요. //First 클래스 선언 class First { private: int a; public: void set(int a); void print() const; }; //Second 클래스 선언 class Second :public First { private: int b; public: void set(int a, int b); void print() const; }; 풀이. //First 클래스의 메소드 정의 void First::set(int a2) { First::a = a2; } void First::print() const { cout

    [C++]vector를 2차원으로 선언하는 방법

    c 스타일 배열을 2차원으로 선언하는 방법은 간단하다. arr[i][j]와 같이 선언하면 된다. 벡터를 2차원으로 선언하려면 어떻게 해야 할까? 2차원 배열은 크기가 i*j인 표의 형태로 이해하기 마련이다. 실상은 i개의 배열이 있고, 각각의 원소가 j개의 배열을 가리키고 있는 형태이다. 다시 말해 배열이 배열을 담고 있는 형태이다. arr[][0] arr[][1] arr[][2] arr[0] → arr[0][0] arr[0][1] arr[0][1] arr[1] → arr[1][0] arr[1][1] arr[1][2] arr[2] → arr[2][0] arr[2][1] arr[2][2] arr[3] → arr[3][0] arr[3][1] arr[3][2] 벡터도 이와 같이 벡터가 벡터를 담은 형태로 선언..

    [C++] 생성자와 소멸자

    객체에는 특별한 멤버 함수인 생성자와 소멸자가 있다. 생성자가 호출되면 객체가 생성되고, 소멸자가 호출되면 객체가 정리된다. 생성자 생성자는 객체를 생성하는 멤버 함수이다. 생성자 내부에서 객체의 데이터 멤버를 초기화한다. 클래스를 정의할 때 멤버를 선언한다고 초기화가 이루어지는 것은 아니다. 선언 과정에서는 멤버의 이름과 자료형만 지정한다. 생성자는 1. 객체를 생성하고 데이터 멤버를 초기화하는 역할을 수행하므로 리턴값을 가질 수 없다. 2. 이름이 클래스의 이름과 같다. 3. 멤버를 초기화하려면 값을 변경해야 하므로 const 한정자를 붙일 수 없다. 4. 멤버 함수이므로 클래스 정의에서 선언해야 한다. class Circle { public: /*생성자*/ Circle(double radius);/..

    [C++] 클래스의 구조

    C++에서는 새로운 자료형(타입)을 만들 때 클래스(class)를 사용한다. 타입으로 클래스를 만들고, 이를 기반으로 인스턴스인 객체를 만든다. 클래스를 기반으로 인스턴스를 만드는 행위를 인스턴스화(instantiation)이라고 부른다. 객체 지향 프로그래밍에서는 속성과 행위를 선언하는 클래스 정의, 행위를 정의하는 멤버 함수 정의, 객체를 인스턴스화하고 사용하는 애플리케이션 구현이 필요하다. 클래스 작성하기 클래스 정의 #include using namespace std; //클래스 정의 class Circle { private: double radius; public: double getArea() const; void setRadius(double value); }; //멤버 함수 정의 doubl..

    while 반복문을 종료하는 방법: 센티넬, EOF, 플래그

    카운터 제어 while 반복문 #include using namespace std; int main() { int counter = 0; while (counter > num; } cout > 연산자를 입력하면 된다. 이 연산자는 스트림에서 항목을 읽다가 EOF를 만나면 false를 리턴한다. //키보드 while(cin >> num) { ... } //파일 while(infile >> num) { ... } //키보드 입력 EOF로 반복 종료하기 #include using namespace std; int main() { int num; int sum{0}; while (cin >> num) { sum +..

    [C++] 조정자를 사용해 입출력 형식을 지정하는 방법

    조정자(manipulator)는 입출력 형식을 바꿀 수 있는 객체이다. 별 다른 지시를 하지 않으면 프로그램은 값을 표준 형식(standard format)으로 입력하고 출력한다. 때에 따라서는 정수를 10진수가 아닌 16진수로 표시하고 싶을 수도 있고, 소수의 자릿수를 지정하고 싶을 수도 있다. 조정자는 이런 상황을 위해 제공하는 객체이다. 여러가지 조정자 입력할 때도 방법은 동일하므로, 출력하는 경우만 예시로 들었다. endl 개행을 위해서 사용했던 endl도 사실은 조정자에 속한다. '\n' 조정자를 추가해 줄바꿈을 하도록 설계되어 있다. 매개변수를 필요로 하지 않는 조정자이고, 스트림의 상태를 변경하지 않는다. noboolalpha, boolalpha bool 값을 정수로 표시할지, 문자 리터럴로..

    [C++] 변수를 초기화하는 세 가지 방법

    C++에서는 변수를 초기화 하는 방법이 세 가지 있다. 대입하기 (Copy Initialization) int num = 1; 대입 연산자(=)을 통해 우변의 값을 좌변에 대입하여 변수를 초기화하는 방법이다. C언어에서 사용하던 방법을 그대로 이용할 수 있다. 괄호 사용하기 (Direct Initialization) int num( 1 ); 변수 이름 다음에 바로 괄호를 사용하여 초기화할 수도 있다. 클래스와 같은 더 복잡한 객체를 효율적으로 선언할 수 있도록 해준다. 중괄호 사용하기 (Brace Initialization) int num{ 1 }; int num2 = { 2 }; int num3 {};//0으로 초기화 Uniform Initialization, List Initialization이라고도..