STUDY BLOG

명품 C++ programming Chapter 03 예제 본문

Software/C++

명품 C++ programming Chapter 03 예제

쥬루 2020. 10. 29. 23:22

명품 C++ programming Chapter 03 예제 연습

 

예제 3-1 Circle 클래스의 객체 생성 및 활용

#include <iostream>
using namespace std;

class Circle{
piblic:
	int radius;
    double getArea();
};

double Circle::getArea(){
	return 3.14*radius*radius;
}

int main(){
	Circle donut; // 객체 donut 생성
    donut.radius =1; // donut의 멤버 변수 접근
    double area = donut.getArea(); // donut의 멤버 함수 호출
    cout << "donut 면적 : " << area << endl;
    
    Circle pizza;
    pizza.radius = 30;
    area = pizza.getArea();
    cout << "pizza 면적 : " << area << endl;
    
}

 

예제 3-2 Rectangle 클래스 만들기

// Q. 다음 main() 함수가 잘 작동하도록 너비와 높이를 가지고 면적 계산 기능을 가진 Rectangle 클래스를 작성하고
// 전체 프로그램을 완성하라.

// (main함수만 주어짐)

#include <iostream>
using namespace std;

class Rectangle {
public :
	int width;
    int height;
    int getArea();
};

int Rectangle::getArea(){
	return width*height;
}

int main(){
	Rectangle rect;
    rect.width =3;
    rect.height =5;
    cout << "사각형의 면적은 " << rect.getArea() << endl;
    
    }

 

예제 3-3 2개의 생성자를 가진 Circle 클래스

#include <iostream>
using namespace std;

class Circle {
public :
	int radius;
    Circle();
    Circle(int r);
    double getArea();
};

Circle::Circle(){
	radius =1;
    cout << "반지름 " << radius << "인 원 생성" << endl;
}

Circle::Circle(int r){
	radius = r;
    cout << "반지름 " << radius << "인 원 생성" << endl;
}

double Circle::getArea(){
	return 3.14*radius*radius;
}

int main(){
	Circle donut; // donut 객체 생성, Circle() 호출
    double area = donut.getArea();
    cout << "donut 면적은 " << area << endl;
    
    Circle pizza(30); // pizza 객체 생성, Circle(int r) 생성자 호출
    area = pizza.getArea();
    cout << "pizza 면적은 " << area << endl;
}

 

예제 3-4 생성자에서 다른 생성자 호출 연습 (위임 생성자 만들기 연습)

#include <iostream>
using namespace std;

class Circle {
public :
	int radius;
    Circle();
    Circle(int r);
    double getArea();
};

Circle::Circle() : Circle(1){ }

Circle::Circle(int r){
	radius = r;
    cout << "반지름 " << radius << "인 원 생성" << endl;
}

double Circle::getArea(){
	return 3.14*radius*radius;
}

int main() {
	Circle donut;
    double area = donut.getArea();
    cout << "donut 면적 : " << area << endl;
    
    Circle pizza(30);
    area = pizza.getArea();
    cout << "pizza 면적 : " << area << endl;
    
}

 

예제 3-5 멤버 변수 초기화와 위임 생성자 활용

//다음 Point 클래스의 멤버 x,y를 생성자 서두에 초깃값으로 초기화하고 위임 생성자를 이용하여 재작성하라.

#include <iostream>
using namespace std;

class Point{
	int x, y;
public :
	Point();
    Point(int a, int b);
    void show() { cout << "(" << x << ", " << y << ")" << endl; }
};

Point::Point() : Point(0,0) { }

Point::Point(int a, int b)
	:x(a), y(b) { }
    
int main(){
	Point origin;
    Point target(10,20);
    orgin.show();
    target.show();
}

 

예제 3-6 Rectangle 클래스 만들기

//다음 main()함수가 잘 작동하도록 Rectangle 클래스를 작성하고 프로그램을 완성하라.
//Rectangle 클래스는 width,height의 두 멤버 변수와 3개의 생성자, 그리고 isSqure() 함수를 가짐

//main()함수만 주어짐

#include <iostream>
using namespace std;

class Rectangle {
public :
	int width, height;
    Rectangle();
    Rectangle(int w, int h);
    Rectangle(int length);
    bool isSqure();
};

Rectangle::Rectangle() {
	width = height = 1;
}

Rectangle::Rectangle(int w, int h) {
	width = w; height = h;
}

Rectangle::Rectangle(int length) {
	width = height = length;
}

bool Rectangle::isSquare() {
	if(width==height)
    	return true;
    else
    	return false;
}

int main() {
	Rectangle rect1;
    Rectangle rect2(3,5);
    Rectangle rect3(3);
    
    if(rect1.isSquare())
    	cout << "rect1은 정사각형" << endl;
    if(rect2.isSquare())
    	cout << "rect2은 정사각형" << endl;
    if(rect3.isSquare())
    	cout << "rect3은 정사각형" << endl;
        
}

 

예제 3-7 Circle 클래스에 소멸자 작성 및 실행

#include <iostream>
using namespace std;

class Circle {
public:
	int radius;
    Circle();
    Circle(int r);
    ~Circle();
    double getArea();
};

Circle::Circle(){
	radius = 1;
    cout << "반지름 " << radius << "인 원 생성" << endl;
}

Circle::Circle(int r){
	radius = r;
    cout << "반지름 " << radius << "인 원 생성" << endl;
}

Circle::~Circle(){
    cout << "반지름 " << radius << "인 원 소멸" << endl;
}

double Circle::getArea(){
	return 3.14*radius*radius;
}

int main(){
	Circle donut;
    Circle pizza(30);
    return 0;
}

 

3-8 지역 객체와 전역 객체의 생성 및 소멸 순서

#include <iostream>
using namespace std;

class Circle {
public:
	int radius;
    Circle();
    Circle(int r);
    ~Circle();
    double getArea();
};

Circle::Circle(){
	radius = 1;
    cout << "반지름 " << radius << "인 원 생성" << endl;
}

Circle::Circle(int r){
	radius = r;
    cout << "반지름 " << radius << "인 원 생성" << endl;
}

Circle::~Circle(){
    cout << "반지름 " << radius << "인 원 소멸" << endl;
}

double Circle::getArea(){
	return 3.14*radius*radius;
}

Circle globalDonut(1000);
Circle globalPizza(2000);

void f() {
	Circle fDonut(100);
    Circle fPizza(200);
}

int main(){
	Circle maindonut;
    Circle mainpizza(30);
    f();
}

 

예제 3-9 다음 소스에서 컴파일 오류가 발생하는 곳은 어디인가?

#include <iostream>
using namespace std;

class PrivateAccessError {
private:
	int a;
    void f();
    PrivateAccessError();
public:
	int b;
    PrivateAccessError(int x);
    void g();
};

PrivateAccessError::PrivateAccessError(){
	a = 1;
    b = 1;
}

PrivateAccessError::PrivateAccessError(int x){
	a = x;
    b = x;
}

void PrivateAccessError::f(){
	a = 5;
    b = 5;
}

void PrivateAccessError::g(){
	a = 6;
    b = 6;
}

int main(){
	PrivateAccessError objA; // PrivateAccessError()는 private이므로 호출불가
    PrivateAccessError objB(100);
    objB.a=10; // a는 private이므로 접근 불가
    objB.b=20;
    objB.f(); // f()는 private이므로 호출 불가
    objB.g();
}

 

예제 3-10 Circle 클래스를 C++ 구조체를 이용하여 재작성

#include <iostream>
using namespace std;

struct StructCircle {
private:
	int radius;
public:
	StructCircle(int r) { radius = r; }
    double getArea();
};

double StructCircle::getArea(){
	return 3.14*radius*radius;
}

int main(){
	StructCircle waffle(3);
    cout << "면적은 " << waffle.getArea();
}

 

예제 3-11 헤더 파일과 cpp 파일로 분리하기

//두개의 정수를 입력받아 덧셈을 실행하는 프로그램, 헤더파일 및 cpp 파일로 분리해서 재작성

#include <iostream>
using namespace std;

class Adder{
	int op1, op2;
public:
	Adder(int a, int b);
    int process();
};

Adder::Adder(int a, int b) {
	op1 = a; op2 = b
}

int Adder::process() {
	return op1 + op2;
}

class Calculator{
piblic:
	void run();
};

void Calculator::run(){
	cout << "두 개의 수를 입력하세요 >> ";
    int a, b;
    cin >> a >> b;
    Adder adder(a,b);
    cout << adder.process();
}

int main() {
	Calculator clac;
    clac.run();
}
//Adder.h

#ifndef ADDER_H
#define ADDER_H

class Adder {
	int op1, op2;
public:
	Adder(int a, int b);
    int process();
};

#endif
//Adder.cpp

#include "Adder.h"

Adder::Adder(int a, int b) {
	op1 = a; op2 = b
}

int Adder::process() {
	return op1 + op2;
}

//Calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H

class Calculator{
piblic:
	void run();
};

#endif
//Calculator.cpp

#include <iostream>
using namespace std;

#intluce "Calculator.h"
#include "Adder.h"

void Calculator::run(){
	cout << "두 개의 수를 입력하세요 >> ";
    int a, b;
    cin >> a >> b;
    Adder adder(a,b);
    cout << adder.process();
}


//main.cpp

int main(){
	Calculator clac;
    clac.run();
}

 

오타 지적 및 조언은 항상 환영입니다.

감사합니다