1. 문제

 

히스토그램 클래스에 <<, ! 연산자 작성

 

히스토그램을 표현하는 Histogram 클래스를 만들고 <<, ! 연산자를 작성해보자. Histogram 클래스는 영문자 알파벳만 다루며 대문자는 모두 소문자로 변환하여 처리한다. Histogram 클래스를 활용하는 코드 사례는 다음과 같다.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <string>
using namespace std;

class Histogram {
	string his;
public :
	Histogram(string s) { his = s; }
	Histogram& operator << (string s) {
		this->his += s;
		return *this;
	}
	Histogram& operator << (char s) {
		this->his += s;
		return *this;
	}
	void operator !() {
		int i, count=0;
		int anum[26];
		for(i=0;i<26;i++) anum[i]=0;

		cout << his << endl << endl;
		
		for(i=0; i< his.size(); i++) {
			if( isalpha( his.at(i) ) ) 
			{
				int c = tolower( his.at(i) );
				anum[ c-97 ]++;
				count++;
			}
		}
		cout << "총 알파벳 수 " << count << endl;
		for(i=0; i<26; i++) {
			cout << (char)(i+97) << ":";
			for(int k=0; k< anum[i]; k++) cout << "*";
			cout << endl;
		}
	}
};
 
int main() {
	Histogram song("Wise men say, \nonly fools rush in But I can't help, \n");
	song << "falling" << " in love with you." << "- by ";
	song << 'k' << 'i' << 't';
	!song;
}

 

4. 설명

 

  Histogram 클래스에서 string변수를 매개변수로 가지는 생성자 하나를 생성합니다.

 

 또한, 구현해야 하는 연산자 함수는 string 변수를 입력받는 "<<" 와 char형 변수를 입력 받는 "<<", 그리고 히스토그램을 그리는 "!" 로 3개 입니다.

 

 

"<<" 연산자 함수는 단지 클래스 멤버 변수의 "+=" 연산자를 사용하여서 문자열을 연결시켜주면 됩니다. 연결을 시켜준 후 자신을 가리키는 *this를 리턴해줍니다.

 

-> 단, 여기서 주의하실 점은 main에서 << 연산자를 사용하여서 값들을 연속으로 입력 받을 수 있도록 하고자 하면 리턴형을 Histogram& 으로 해주셔야 합니다. 

 

 

"!" 연산자 함수는 히스토그램을 그리는 기능을 하며 우선 각 알파벳들의 개수를 저장할 함수 anum을 선언합니다. 그 후 알파벳인지 검사를 합니다. 그 다음 대문자일 수도 있으니 tolower() 함수를 이용하여서 소문자로 고쳐줍니다.

 

 

총 알파벳 수를 구했으면 이제 히스토그램을 그립니다.

 

-> (char)(i+97) 를 for문을 이용하여서 출력하면 a~z를 간편하게 출력할 수 있습니다.

 

 

 

1. 문제

 

9. 통계를 내는 Statistics 클래스를 만들려고 한다. 데이터는 Statistics 클래스 내부에 int 배열을 동적으로 할당받아 유지한다. 다음과 같은 연산이 잘 이루어지도록 Statistics 클래스와 !, >>, <<, ~ 연산자 함수를 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
using namespace std;

class Statistics {
	int *p;
	int count;
public :
	Statistics(){ p = new int[10]; count=0; }

	bool operator ! () {
		if( count == 0 ) return true;
		else return false;
	}
	Statistics& operator << (int n) {
		p[count] = n;
		count++;
		return *this;
	};
	void operator ~ () {
		for(int i=0; i< count; i++)
			cout << p[i] << ' ';
		cout << endl;
	}
	void operator >>(int& avg) {
		int sum=0;
		for(int i=0;i< count;i++)
			sum += p[i];
		avg = sum / count;
	}
};

int main() {
	Statistics stat;
	if(!stat) cout << "현재 통계 데이타가 없습니다." << endl;

	int x[5];
	cout << "5 개의 정수를 입력하라>>";
	for(int i=0; i<5; i++) cin >> x[i];

	for(int i=0; i<5; i++) stat << x[i];
	stat << 100 << 200;
	~stat;

	int avg;
	stat >> avg;
	cout << "avg=" << avg << endl;
}

 

4. 설명

 

  Statistics 클래스는 내부에 int 배열을 동적으로 할당 받습니다. 그러므로 생성자에서 임의로 크기가 10인 int 배열을 선언한 후 이용하였습니다.

 

 

 "!" 연산자 함수는 return 형이 bool 입니다. 이 함수는 클래서 멤버 변수인 배열의 저장된 데이터가 없을 시 true를 리턴 합니다. 저는 편의상 배열 요소의 개수를 저장할 int count를 선언한 후 이용하였습니다.

 

 

"<<" 연산자 함수는 stat << 100 << 200; 이처럼 연속적으로 값을 입력받기 위해서 리턴 형을 Statistics& 로 해줍니다.

 

-> 입력한 값을 저장해준 후 return *this; 를 해주시면 됩니다.

 

 

 
"~" 연산자 함수는 통계 데이터를 모두 출력하는 함수로서 count 변수와 for문을 이용하여서 간단히 출력할 수 있습니다.
 
 
">>" 연산자 함수는 배열 요소들의 평균을 구하여 줍니다. 이 또한 for문과 count 변수를 이용하시면 간단히 구현하실 수 있습니다. 
 
 

 

 

 

1. 문제

 

10. 스택 클래스 Stack을 만들고 푸시(push)용으로 << 연산자를, 팝(pop)을 위해 >> 연산자를, 비어 있는 스택인지를 알기 위해 ! 연산자를 작성하라. 다음 코드를 main()으로 작성하라.

 

 

2. 결과

 

 

 

3. 코드


#include <iostream>
using namespace std;

class Stack {
	int stack[10];
	int top;
public :
	Stack() { top=-1; }
	Stack& operator <<(int n) {
		top++;
		stack[top] = n;
		return *this;
	}
	Stack operator >>(int &n) {
		n = stack[top];
		top--;
		return *this;
	}
	bool operator !() {
		if( top == -1 ) return true;
		else return false;
	}
};

int main() {
	Stack stack;
	stack << 3 << 5 << 10;
	while(true) {
		if(!stack) break;
		int x;
		stack >> x;
		cout << x << ' ';
	}
	cout << endl;
}

 

 

4. 설명

 

 Stack의 기능을 하는 Stack 클래스를 구현합니다.

 

 

 "<<" 푸시 기능을 하도록 해야 하므로 스택의 push처럼 top을 하나씩 증가시킨 후 값을 저장해 줍니다.

 

-> 이 문제에서도 stack << 3 << 5 ... 이처럼 연속적으로 입력받을 수 있도록 리턴 형을 Stack& 으로 해줍니다.

 

 

 ">>" 팝 기능을 하도록 구현합니다.

 

 

 "!" 은 top == -1 이면 저장된 값이 없는 것이므로 이경우에는 return true;를 해줍니다.

 

 

 

1. 문제

 

7. 원을 추상화한 Circle 클래스는 간단히 아래와 같다.

 

다음 연산이 가능하도록 연산자를 프렌드 함수로 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
using namespace std;

class Circle {
	int radius;
public : 
	Circle(int radius=0) { this->radius = radius; }
	void show() { cout << "radius = " << radius << " 인 원" << endl; }
	Circle operator ++() {
		radius++;
		return *this;
	}
	Circle operator ++(int n) {
		Circle temp = *this;
		radius++;
		return temp;
	}
};
int main() {
	Circle a(5), b(4);
	++a;
	b = a++;
	a.show();
	b.show();
}

 

4. 설명

 

   "++" 연산자 함수를 구현합니다.

 

"++"연산자는 ++a 와 a++ 처럼 실행 순서가 두 개의 경우가 있는데 이 함수들을 구현하기 위해서는 ++a를 구현하는 함수는 매개변수가 없고, a++를 구현하는 함수는 매개변수가 있도록 구현하면 됩니다.

 

 

++a의 사용하는  "++"는 radius++;를 해준 후 return *this;를 해줍니다.

 

 

a++연산자 함수의서 입력받은 매개변수 n은 사용하지 않으므로 그냥 무시하셔도 됩니다. 

 

-> 현재 객체 *this를 Circle변수에 저장한 후 radius++를 해준 후 ++을 해주기 전 저장했었던 temp를 return 하여서 radius++가 되기 전 객체를 return 합니다.

 

 

 

 

 

1. 문제

 

8. 문제 7번의 Circle 객체에 대해 다음 연산이 가능하도록 연산자를 구현하라.

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
using namespace std;

class Circle {
	int radius;
public : 
	Circle(int radius=0) { this->radius = radius; }
	void show() { cout << "radius = " << radius << " 인 원" << endl; }
	friend Circle operator +(int n, Circle c);
};
Circle operator +(int n, Circle c) {
	Circle temp;
	temp.radius = n + c.radius;
	return temp;
}
int main() {
	Circle a(5), b(4);
	b = 1 + a;
	a.show();
	b.show();
}

 

 

4. 설명

 

 b = 1 + a; 연산이 가능하도록  "+" 연산자 함수를 구현 합니다.

 

 

순서가 1 + a이므로 이 함수는 프렌드 함수로 구현을 해주어야 합니다.

 

-> a + 1 이였다면 멤버 함수로 구현할 수 있습니다

 

Circle 클래스 변수 하나를 선언한 후 Circle 클래스 변수 c의 저장된 radius의 +n을 한 값을 새로 선언한 클래스 변수 radius의 저장해 준 후 return 해줍니다.

 

-> 연산자 함수의 return형은 Circle 입니다.

 

 

1. 문제

 

6. 2차원 행렬을 추상화한 Matrix 클래스를 활용하는 다음 코드가 있다.

 

(1) <<, >> 연산자 함수를 Matrix의 멤버 함수로 구현하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
using namespace std;

class Matrix {
	int duo[4];
public :
	Matrix(int a=0, int b=0, int c=0, int d=0) {
		duo[0] = a; duo[1] = b;
		duo[2] = c; duo[3] = d;
	}
	void operator >>(int n[]) {
		for(int i=0; i<4; i++)
			n[i] = duo[i];
	}
	void operator << (int n[]) {
		for(int i=0; i<4; i++)
			duo[i] = n[i];
	}
	void show() {
		cout << "Matrix = { ";
		for(int i=0; i<4; i++) {
				cout << duo[i] << ' ';
		}
		cout << '}' << endl;
	}
};

int main() {
	Matrix a(4,3,2,1), b;
	int x[4], y[4] = {1,2,3,4};
	a >> x;
	b << y;

	for(int i=0; i<4; i++) cout << x[i] << ' ';
	cout << endl;
	b.show();
}

 

4. 설명

 

  ">>" 연산자 함수는 Matrix 변수에 저장되어 있는 duo 배열의 각 원소들을 int형 배열 n[]의 각각 저장하도록 합니다.

 

"<<" 연산자는 int형 배열 n[]의 저장되어 있는 원소들을 duo 클래스 멤버 변수 duo배열의 각각 저장하도록 구현 합니다.

 

-> 배열이므로 참조 변수를 사용할 필요가 없습니다.

 

 


 

 

 

1. 문제

 

6. 2차원 행렬을 추상화한 Matrix 클래스를 활용하는 다음 코드가 있다.

 

(2) <<, >> 연산자 함수를 Matrix의 프렌드 함수로 구현하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
using namespace std;

class Matrix {
	int duo[4];
public :
	Matrix(int a=0, int b=0, int c=0, int d=0) {
		duo[0] = a; duo[1] = b;
		duo[2] = c; duo[3] = d;
	}
	friend void operator >>(Matrix a, int n[]);
	friend void operator << (Matrix &a, int n[]);
	void show() {
		cout << "Matrix = { ";
		for(int i=0; i<4; i++) {
				cout << duo[i] << ' ';
		}
		cout << '}' << endl;
	}
};
void operator >>(Matrix a, int n[]) {
		for(int i=0; i<4; i++)
			n[i] = a.duo[i];
	}
void operator << (Matrix &a, int n[]) {
		for(int i=0; i<4; i++)
			a.duo[i] = n[i];
	}

int main() {
	Matrix a(4,3,2,1), b;
	int x[4], y[4] = {1,2,3,4};
	a >> x;
	b << y;

	for(int i=0; i<4; i++) cout << x[i] << ' ';
	cout << endl;
	b.show();
}

 

 

4. 설명

 

 "<<" 연산자 함수를 구현할 시 Matrix &a로 참조 변수로 입력 받아야 합니다. 그러므로 함수가 끝난 후에도 변경된 값이 main함수에서 유지 됩니다.

 

 

">>"연산자 함수에서는 참조 변수를 사용하지 않은 이유는 Matrix의 멤버 변수 duo의 요소들을 int형 배열 n[]에 저장할 뿐 값이 변경되어서 그 값이 함수가 끝나도 유지될 필요가 없기 때문입니다.

 

 

 

1. 문제

 

5. 2차원 행렬을 추상화한 Matrix 클래스를 작성하고, show() 멤버 함수와 다음 연산이 가능하도록 연산자를 모두 구현하라.

 

(1) 연산자 함수를 Matrix의 멤버 함수로 구현하라.

 

 

2. 결과

 

 

3. 코드

 


#include <iostream>
using namespace std;

class Matrix {
	int duo[2][2];
public :
	Matrix(int a=0, int b=0, int c=0, int d=0) {
		duo[0][0] = a; duo[0][1] = b;
		duo[1][0] = c; duo[1][1] = d;
	}
	Matrix operator + (Matrix b) { 
		Matrix temp;
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				temp.duo[i][j] = duo[i][j] + b.duo[i][j];
		}
		return temp;
	}
	Matrix operator += (Matrix b) {
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				duo[i][j] += b.duo[i][j];
		}
		return *this;
	}
	bool operator ==(Matrix b) {
		int count=0;
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				if( duo[i][j] == b.duo[i][j] ) count++;
		}
		if( count == 4) return true;
		else return false;
	}
	void show() {
		cout << "Matrix = { ";
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				cout << duo[i][j] << ' ';
		}
		cout << '}' << endl;
	}
};

int main() {
	Matrix a(1,2,3,4), b(2,3,4,5), c;
	c = a + b;
	a += b;
	a.show(); b.show(); c.show();
	if( a == c)
		cout << "a and c are the same" << endl;
}

 

 

4. 설명

 

  Matrix 클래스에서 구현해야 할 멤버들은 "+", "+=", "==" 와 show() 멤버 함수, 생성자 입니다.

 

멤버 변수 duo는 2차원 배열로 선언하였습니다. 일차원 배열로 선언하여 사용했으면 더 코드가 짧아졌겠지만 2차원 행렬을 추상화한 클래스이므로 2차원 배열로 선언하였습니다.

 

 

 

"+" 함수에서는 Matrix 변수 하나를 선언한 후 2차원 행렬에서 같은 위치에 있는 값끼리 더해주어서 2차원 행렬끼리의 "+"이 일어나는 것처럼 구현해 줍니다.
 
"+="함수에서는 Matrix 변수 하나를 입력받아서 2차원 행렬 같은 위치에 있는 요소들끼리 += 연산을 실행하도록 한후 return *this; 로 자신을 return 해줍니다.
 
"==" 함수에서는 int형 변수 하나를 선언하여서 2차원 행렬들 각각 같은 위치에 있는 값들이 같은지를 비교하여서 true와 false 중 return하도록 하였습니다. 이렇게 하지 않아도 
 
if( duo[0][0] == b.duo[0][0] && duo[0][1] == b.duo[0][1] && ...  ) return true;
else return false;
 
이처럼 구현할 수도 있습니다.
 
 
show() 멤버 함수는 예시 출력 결과에서 보듯이 2차원 행렬 요소들을 출력하도록 구현합니다.
 

 


 

 

 

1. 문제

 

5. 2차원 행렬을 추상화한 Matrix 클래스를 작성하고, show() 멤버 함수와 다음 연산이 가능하도록 연산자를 모두 구현하라.

 

(2) 연산자 함수를 Matrix의 프렌드 함수로 구현하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
using namespace std;

class Matrix {
	int duo[2][2];
public :
	Matrix(int a=0, int b=0, int c=0, int d=0) {
		duo[0][0] = a; duo[0][1] = b;
		duo[1][0] = c; duo[1][1] = d;
	}
	friend Matrix operator + (Matrix a, Matrix b);
	friend void operator += (Matrix& a, Matrix b);
	friend bool operator ==(Matrix a, Matrix b);
	void show() {
		cout << "Matrix = { ";
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				cout << duo[i][j] << ' ';
		}
		cout << '}' << endl;
	}
};
Matrix operator + (Matrix a, Matrix b) { 
		Matrix temp;
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				temp.duo[i][j] = a.duo[i][j] + b.duo[i][j];
		}
		return temp;
	}
void operator += (Matrix& a, Matrix b) {
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				a.duo[i][j] += b.duo[i][j];
		}
		
	}
bool operator ==(Matrix a,Matrix b) {
		int count=0;
		for(int i=0; i<2; i++) {
			for(int j=0; j<2; j++) 
				if( a.duo[i][j] == b.duo[i][j] ) count++;
		}
		if( count == 4) return true;
		else return false;
	}

int main() {
	Matrix a(1,2,3,4), b(2,3,4,5), c;
	c = a + b;
	a += b;
	a.show(); b.show(); c.show();
	if( a == c)
		cout << "a and c are the same" << endl;
}

 

 

4. 설명

 

  프렌드 함수와 멤버 함수로 구현하는 방법은 추가적으로 매개변수로 입력받은 후 이용하는 점만 다르므로 굳이 또 다시 설명하지는 않겠습니다.

 

단, "+=" 함수에서는 (Matrix &a, Matrix b) 로 a를 참조 변수로 입력받아야만 함수가 끝나도 덧셈을 한 후 a의 저장된 값이 main함수의서 유지됩니다.

 

 

 

1. 문제

 

3. 다음 연산을 통해 공짜 책인지를 판별하도록 ! 연산자를 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <string>
using namespace std;

class Book {
	string title;
	int price, pages;
public : 
	Book(string title="", int price=0, int pages=0) {
		this->title = title; this->price = price; this->pages = pages;
	}
	void show() {
		cout << title << ' ' << price << "원 " << pages << " 페이지" << endl;
	}
	string getTitle() { return title; }
	bool operator !() { 
		if( price == 0 ) return true;
		else false;
	}
};

 
int main() {
	Book book("벼룩시장", 0, 50);
	if( !book ) cout << "공짜다" << endl;
}

 

 

4. 설명

 

 "!" 연산자는 return 타입이 bool 입니다.

 

"!"이 실행되면 클래스 변수의 price 값이 0인지 비교를한 후 만약 0이라면 return true;를 아니라면 return false;를 해줍니다.

 

 


 

 

 

1. 문제

 

4. 다음 연산을 통해 책의 제목을 사전 순으로 비교하고자 한다. < 연산자를 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <string>
using namespace std;

class Book {
	string title;
	int price, pages;
public : 
	Book(string title="", int price=0, int pages=0) {
		this->title = title; this->price = price; this->pages = pages;
	}
	void show() {
		cout << title << ' ' << price << "원 " << pages << " 페이지" << endl;
	}
	string getTitle() { return title; }
	friend bool operator < (string s, Book b);
};
bool operator < (string s, Book b) {
	if( s < b.title ) return true;
	else return false;
}
 
int main() {
	Book a("청춘", 20000, 300);
	string b;
	cout << "책 이름을 입력하세요>>";
	getline(cin, b);
	if( b < a ) 
		cout << a.getTitle() << "이 " << b << "보다 뒤에 있구나!" << endl;
}

 

 

4. 설명

 

  '<' 연산자를 프렌드 함수로 구현하였습니다.

 

이 문제의 경우에는 string 변수 < Book 클래스 변수 이므로 프렌드 함수로 구현을 해야만 합니다.

 

-> Book 클래스 < string 변수 였다면 클래스 멤버 함수로 구현할 수 있습니다.

 

 

 '<' 구현 함수에서는 string 변수 s와 Book 클래스 변수 b의 title을 '<'를 사용하여서 참이면 return true;를 아니라면 return false;를 해줍니다.

 

-> string변수이므로 사전식 순서 입니다.  [ 뒤로 갈수록 더 큰 값 입니다.

 

 

 

 

1. 문제

 

2. Book 객체를 활용하는 사례이다.

 

(1) 세 개의 == 연산자 함수를 가진 Book 클래스를 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <string>
using namespace std;

class Book {
	string title;
	int price, pages;
public : 
	Book(string title="", int price=0, int pages=0) {
		this->title = title; this->price = price; this->pages = pages;
	}
	void show() {
		cout << title << ' ' << price << "원 " << pages << " 페이지" << endl;
	}
	string getTitle() { return title; }
	bool operator == (int n) { 
		if( price == n ) return true;
		else return false;
	}
	bool operator == (string n) { 
		if( title == n ) return true;
		else return false;
	}
	bool operator == (Book n) {
		if( title == n.title && price == n.price && pages == n.pages ) return true;
		else return false;
	}
};

int main() {
	Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
	if( a == 30000 ) cout << "정가 30000원" << endl;
	if( a == "명품 C++" ) cout << "명품 C++ 입니다." << endl;
	if( a == b ) cout << "두 책이 같은 책입니다." << endl;
}

 

 

4. 설명

 

 연산자 "=="를 오버로딩하여서 매개 변수가 다른 함수 3개를 구현합니다.

 

매개변수가 int 형일 시 price와 비교를 하도록 구현하고, string 형 일시 title과 비교하도록합니다.

 

또한, Book 클래스와 사용했을 시 tilte, price, pages를 비교하여서 다 같다면 return true;를 아니면 return false;를 해줍니다.

 

 


 

 

 

1. 문제

 

2. Book 객체를 활용하는 사례이다.

 

(2). 세 개의 == 연산자를 프렌드 함수로 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 


#include <iostream>
#include <string>
using namespace std;

class Book {
	string title;
	int price, pages;
public : 
	Book(string title="", int price=0, int pages=0) {
		this->title = title; this->price = price; this->pages = pages;
	}
	void show() {
		cout << title << ' ' << price << "원 " << pages << " 페이지" << endl;
	}
	string getTitle() { return title; }
	friend bool operator == (Book b, int n);
	friend bool operator == (Book b, string n);
	friend bool operator == (Book b1, Book b2);
};
bool operator == (Book b, int n) { 
		if( b.price == n ) return true;
		else return false;
	}
bool operator == (Book b, string n) { 
		if( b.title == n ) return true;
		else return false;
	}
bool operator == (Book b1, Book b2) {
		if( b1.title == b2.title && b1.price == b2.price && b1.pages == b2.pages ) return true;
		else return false;
	}

int main() {
	Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
	if( a == 30000 ) cout << "정가 30000원" << endl;
	if( a == "명품 C++" ) cout << "명품 C++ 입니다." << endl;
	if( a == b ) cout << "두 책이 같은 책입니다." << endl;
}

 

 

4. 설명

 

 (1)번과 같은 기능을 하는 == 연산자 기능을 하는 함수들을 프렌드 함수로 작성하면 됩니다.

 

Book b 변수를 추가적으로 매개변수로 받아서 이용한다는 점과 friend를 붙이는 것 빼고는 구현하는 방법은 똑같습니다.

 

 

 

 

1. 문제

 

1. Book 객체에 대해 다음 연산을 하고자 한다.

 

(1) +=, -= 연산자 함수를 Book 클래스의 멤버 함수로 구현하라.

 

 

2. 결과

 

 

3. 코드

 


#include <iostream>
#include <string>
using namespace std;

class Book {
	string title;
	int price, pages;
public : 
	Book(string title="", int price=0, int pages=0) {
		this->title = title; this->price = price; this->pages = pages;
	}
	void show() {
		cout << title << ' ' << price << "원 " << pages << " 페이지" << endl;
	}
	string getTitle() { return title; }
	void operator +=(int n) { price += n; }
	void operator -=(int n) { price -= n; }
};

int main() {
	Book a("청춘", 20000, 300), b("미래", 30000, 500);
	a += 500;
	b -= 500;
	a.show();
	b.show();
}

 

4. 설명

 

 operator를 사용하여서 클래스의 멤버 함수로 구현 하였습니다. 

 

"+=" 연산을 하면 클래스 변수에 저장되어 있는 price 값이 입력한 값과 += 계산이 되도록 구현하시면 됩니다.

 

이와 마찬가지로 "-=" 연산도 클래스 변수에 저장되어 있는 price 값과 -= 계산이 되도록 구현하면 됩니다.

 

 


 

 

1. 문제

 

1. Book 객체에 대해 다음 연산을 하고자 한다.

 

(2) +=, -= 연산자 함수를 Book 클래스 외부 함수로 구현하라.

 

 

2. 결과

 

 

3. 코드

 


#include <iostream>
#include <string>
using namespace std;

class Book {
	string title;
	int price, pages;
public : 
	Book(string title="", int price=0, int pages=0) {
		this->title = title; this->price = price; this->pages = pages;
	}
	void show() {
		cout << title << ' ' << price << "원 " << pages << " 페이지" << endl;
	}
	string getTitle() { return title; }
	friend Book operator +=(Book &b, int n);
	friend Book operator -=(Book &b, int n);
};
Book operator +=(Book &b, int n) {
	b.price += n; 
	return b;
}
Book operator -=(Book &b, int n) { 
	b.price -= n; 
	return b;
}

int main() {
	Book a("청춘", 20000, 300), b("미래", 30000, 500);
	a += 500;
	b -= 500;
	a.show();
	b.show();
}

 

 

4. 설명

 

 클래스 외부 함수로 구현하기 위해서는 클래스의 public이 아닌 멤버 변수에도 접근해야 되므로 프렌드 함수로 구현 합니다.

 

프렌드 함수로 구현할 시 (Book &b, int n) 이처럼 b를 참조 변수로 선언합니다. 그런 후 구현부에서 b.price += n; 을 한 후 다시 b를 return 합니다.

 

 

main 함수에서 보면 "a += 500;" 에서 b가 Book 클래스 변수 a이고 int n이 500 이라고 보시면 됩니다.

 

 

+ Recent posts