관리 메뉴

공부 기록장 💻

명품 C++ Programming 7장 실습 문제 - 연산자 중복 함수, friend 함수, 참조 리턴 본문

# Language & Tools/C++

명품 C++ Programming 7장 실습 문제 - 연산자 중복 함수, friend 함수, 참조 리턴

dream_for 2021. 5. 9. 02:01

(명품 C++ 프로그래밍 7장)

 

 

Open Challenge

 

#include <iostream>
#include <ctype.h>
using namespace std;

class Histogram{
	string str;
public:
	Histogram(string str){ this->str=str;}
	Histogram& operator << (string s){
		str+=s;
		return *this;
	}
	Histogram& operator << (char c){
		str+=c;
		return *this;
	}
	void operator ! (){
		cout<<str<<endl<<endl;
		
		int alphaCnt=0;
		for(int i=0;i<str.size();i++){
			str[i]=tolower(str[i]);
			if(isalpha(str[i])) alphaCnt++;
		}
		cout<<"총 알파벳 수 "<<alphaCnt<<endl;
		
		for(char ch='a';ch<='z';ch++){
			cout<<ch<<" : ";
			for(int i=0;i<str.size();i++)
				if (str[i]==ch) 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;
}

 

 

 

1. 

(1) += 연산자 함수를 멤버 함수로 구현

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

class Book{
	string name;
	int price;
	int page;
public:
	Book(string n, int pr, int pg){
		name=n;
		price=pr;
		page=pg;
	}
	void show(){cout<<name<<" "<<price<<"원 "<<page<<" 페이지"<<endl;}
	Book& operator += (int op2){this->price+=op2;}
	Book& operator -= (int op2){this->price-=op2;}
};

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

 

(2) += 연산자 함수를 외부 함수로 구현, friend로 선언

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

class Book{
	string name;
	int price;
	int page;
public:
	Book(string n, int pr, int pg){
		name=n;
		price=pr;
		page=pg;
	}
	void show(){cout<<name<<" "<<price<<"원 "<<page<<" 페이지"<<endl;}
	friend void operator += (Book &op1, int op2);
	friend void operator -= (Book &op1, int op2);
};

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

 

 

2. 

(1) == 연산자 멤버 함수

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

class Book{
	string name;
	int price;
	int page;
public:
	Book(string n, int pr, int pg){
		name=n;
		price=pr;
		page=pg;
	}
	void show(){cout<<name<<" "<<price<<"원 "<<page<<" 페이지"<<endl;}
	bool operator == (int price){ return (this->price==price);}
	bool operator == (string book){ return (this->name==book);};
	bool operator == (Book op2){
		if(this->name==op2.name && this->price==op2.price && this->page==op2.page)
			return true;
		else return false;
	}
};


int main(){
	Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
		
	// == 연산자에 대한 3 종류의 함수 - price, title, 객체와 객체의 비교 
	
	if(a == 30000) cout << "정가 30000원" << endl; // price 비교
	if(a == "명품 C++") cout << "명품 C++ 입니다." << endl; // 책 title 비교
	if(a == b) cout << "두 책이 같은 책입니다." << endl; // title, price, pages 모두 비교 
}

 

(2) 외부 전역 함수로 작성, friend로 선언

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

class Book{
	string name;
	int price;
	int page;
public:
	Book(string n, int pr, int pg){
		name=n;
		price=pr;
		page=pg;
	}
	void show(){cout<<name<<" "<<price<<"원 "<<page<<" 페이지"<<endl;}
	friend bool operator == (Book op1, int price);
	friend bool operator == (Book op1, string book);
	friend bool operator == (Book op1, Book op2);
};

bool operator == (Book op1, int price){ return (op1.price==price);}
bool operator == (Book op1, string book){ return (op1.name==book);};
bool operator == (Book op1, Book op2){
	return (op1.name==op2.name && op1.price==op2.price && op1.page==op2.page);
}

int main(){
	Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
		
	// == 연산자에 대한 3 종류의 함수 - price, title, 객체와 객체의 비교 
	
	if(a == 30000) cout << "정가 30000원" << endl; // price 비교
	if(a == "명품 C++") cout << "명품 C++ 입니다." << endl; // 책 title 비교
	if(a == b) cout << "두 책이 같은 책입니다." << endl; // title, price, pages 모두 비교 
}

 

3.

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

class Book{
	string name;
	int price;
	int page;
public:
	Book(string n, int pr, int pg){
		name=n;
		price=pr;
		page=pg;
	}
	void show(){cout<<name<<" "<<price<<"원 "<<page<<" 페이지"<<endl;}
	bool operator ! (){
		if(price==0) return true;
		else return false;
	}
};

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

 

 

4.

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

class Book{
	string name;
	int price;
	int page;
public:
	Book(string n, int pr, int pg){
		name=n;
		price=pr;
		page=pg;
	}
	string getTitle(){return name;}
	friend bool operator < (string b, Book op2);
};

bool operator < (string b, Book op2){return (b<op2.name);}

int main(){
	Book a("청춘", 20000, 300);
	string b;
	cout << "책 이름을 입력하세요>>";
	getline(cin, b);
	if(b < a) // < (b,a) 
		cout << a.getTitle() << "이 " << b << "보다 뒤에 있구나!" << endl;
}

 

 

5.

(1) +, == 연산자 함수를 클래스 멤버 함수로 작성

#include <iostream>
using namespace std;

class Color{
	int red, green, blue;
public:
	Color(int r=0, int g=0, int b=0){red=r;green=g;blue=b;}
	void show(){cout<<red<<" "<<green<<" "<<blue<<endl;}
	Color operator +(Color op2){
		Color tmp;
		tmp.red=this->red+op2.red;
		tmp.green=this->green+op2.green;
		tmp.blue=this->blue+op2.blue;
		return tmp;
	}
	bool operator ==(Color op2){return (this->red==op2.red && this->green==op2.green && this->blue==op2.blue);}
};

int main(){
	Color red(255,0,0),blue(0,0,255),c;
	c=red+blue;
	c.show();
	
	Color fushia(255,0,255);
	if(c==fushia) cout<<"보라색 맞음"<<endl;
	else cout<<"보라색 아님"<<endl;
}

 

 

(2) friend 로 선언

#include <iostream>
using namespace std;

class Color{
	int red, green, blue;
public:
	Color(int r=0, int g=0, int b=0){red=r;green=g;blue=b;}
	void show(){cout<<red<<" "<<green<<" "<<blue<<endl;}
	friend Color operator +(Color op1, Color op2);
	friend bool operator ==(Color op1, Color op2);
	
};

Color operator +(Color op1, Color op2){
	Color tmp;
	tmp.red=op1.red+op2.red;
	tmp.green=op1.green+op2.green;
	tmp.blue=op1.blue+op2.blue;
	return tmp;
}
bool operator ==(Color op1, Color op2){return (op1.red==op2.red && op1.green==op2.green && op1.blue==op2.blue);}

int main(){
	Color red(255,0,0),blue(0,0,255),c;
	c=red+blue;
	c.show();
	
	Color fushia(255,0,255);
	if(c==fushia) cout<<"보라색 맞음"<<endl;
	else cout<<"보라색 아님"<<endl;
}

 

 

6. 

(1) 멤버 함수로 구현

#include <iostream>
using namespace std;

class Matrix{
	int e[4];
public:
	Matrix(int a=0, int b=0, int c=0, int d=0){
		e[0]=a;
		e[1]=b;
		e[2]=c;
		e[3]=d;
	}
	void show(){
		cout<<"Matrix = { ";
		for(int i=0;i<4;i++) cout<<e[i]<<" ";
		cout<<"}"<<endl;
	}
	Matrix operator +(Matrix op2){
		Matrix tmp;
		for(int i=0;i<4;i++)
			tmp.e[i]=this->e[i]+op2.e[i];
		return tmp;
	}
	Matrix& operator +=(Matrix op2){
		for(int i=0;i<4;i++)
			this->e[i]+=op2.e[i];
	}
	bool operator ==(Matrix op2){
		for(int i=0;i<4;i++)
			if(this->e[i]!=op2.e[i]) return false;
		return true;
	}
};

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;
}

 

(2) 외부 함수로 작성, friend 로 선언

#include <iostream>
using namespace std;

class Matrix{
	int e[4];
public:
	Matrix(int a=0, int b=0, int c=0, int d=0){
		e[0]=a;
		e[1]=b;
		e[2]=c;
		e[3]=d;
	}
	void show(){
		cout<<"Matrix = { ";
		for(int i=0;i<4;i++) cout<<e[i]<<" ";
		cout<<"}"<<endl;
	}
	friend Matrix operator +(Matrix op1, Matrix op2);
	friend void operator +=(Matrix& op1, Matrix op2);
	friend bool operator ==(Matrix op1, Matrix op2);
};

Matrix operator +(Matrix op1, Matrix op2){
	Matrix tmp;
	for(int i=0;i<4;i++)
		tmp.e[i]=op1.e[i]+op2.e[i];
	return tmp;
}
void operator +=(Matrix& op1, Matrix op2){
	for(int i=0;i<4;i++)
		op1.e[i]+=op2.e[i];
}
bool operator ==(Matrix op1, Matrix op2){
	for(int i=0;i<4;i++)
		if(op1.e[i]!=op2.e[i]) return false;
	return true;
}

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;
}

 

 

7. 

(1) <<, >> 연산자 함수를 멤버 함수로 구현

#include <iostream>
using namespace std;

class Matrix{
	int e[4];
public:
	Matrix(int a=0, int b=0, int c=0, int d=0){
		e[0]=a;
		e[1]=b;
		e[2]=c;
		e[3]=d;
	}
	void show(){
		cout<<"Matrix = { ";
		for(int i=0;i<4;i++) cout<<e[i]<<" ";
		cout<<"}"<<endl;
	}
	
	// matrix를 배열에 복사하는 >> 연산자
	void operator >> (int arr[]){
		for(int i=0;i<4;i++)
			arr[i]=this->e[i];
	}
	// 배열을 matrix 에 복사하는 << 연산자 
	void operator << (int arr[]){
		for (int i=0;i<4;i++)
			this->e[i]=arr[i];
	}	
};

int main(){
	Matrix a(4,3,2,1), b;
	int x[4], y[4]={1,2,3,4};
	a>>x; // matirx a를 빈 x 배열에 복사
	b<<y; // y 배열을 빈 matrix b에 복사
	
	for(int i=0;i<4;i++) cout<<x[i]<<' ';
	cout<<endl;
	b.show();
}

 

(2) 프렌드 함수로 구현

#include <iostream>
using namespace std;

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

};

// matrix를 배열에 복사하는 >> 연산자
void operator >> (Matrix &m, int arr[]){
	for(int i=0;i<4;i++)
		arr[i]=m.e[i];
}
// 배열을 matrix 에 복사하는 << 연산자 
void operator << (Matrix &m, int arr[]){
	for (int i=0;i<4;i++)
		m.e[i]=arr[i];
}	
	
int main(){
	Matrix a(4,3,2,1), b;
	int x[4], y[4]={1,2,3,4};
	a>>x; // matirx a를 빈 x 배열에 복사
	b<<y; // y 배열을 빈 matrix b에 복사
	
	for(int i=0;i<4;i++) cout<<x[i]<<' ';
	cout<<endl;
	b.show();
}

 

 

 

8. 

멤버 함수로 작성

#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 ++(){
		this->radius++;
		return *this;
	}
    // Circle& operator ++(){radius++;}
    
	Circle operator ++(int x){
		Circle tmp=*this;
		radius++;
		return tmp;
	}
};

int main(){
	Circle a(5), b(4);
	a.show(); 
	b.show();
	
	++a; // 반지름 1 증가
	b=a++; // 반지름 1 증가
	cout<<endl<<"++a , b=a++ 연산 실행 후"<<endl;
	a.show(); // a의 반지름 1 증가 
	b.show();  // 1증가된 a	
}

 

 

프렌드 함수로 작성

#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 ++(Circle &c);
	friend Circle operator ++(Circle&c, int x);
};

Circle& operator ++(Circle &c){
	c.radius++;
	return c;
}
Circle operator ++(Circle&c, int x){
	Circle tmp=c;
	c.radius++;
	return tmp;
}
	
int main(){
	Circle a(5), b(4);
	a.show(); 
	b.show();
	
	++a; // 반지름 1 증가
	b=a++; // 반지름 1 증가
	cout<<endl<<"++a , b=a++ 연산 실행 후"<<endl;
	a.show(); // a의 반지름 1 증가 
	b.show();  // 1증가된 a	
}

 

9.

#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 op, Circle c);
};

Circle operator +(int op, Circle c){
	Circle tmp;
	tmp.radius=op+c.radius;
	return tmp;
}
int main(){
	Circle a(5), b(4);
	b=1+a;
	
	a.show(); // a의 반지름 1 증가 
	b.show();  // 1증가된 a	
}

 

 

 

10.

 

#include <iostream>
using namespace std;

class Statistics{
	int *p; // 할당받은 메모리의 시작 주소 
	int capacity; // 배열에 할당된 메모리 공간 개수 
	int size; // 배열에 들어있는 요소 개수 
public:
	Statistics(int n=10){ // 생성자 함수 - 초기에 임의로 10개 공간 할당 
		capacity=n;
		size=0;
		p=new int[n]; // int 배열 동적 할당 
	}
	~Statistics(){if(p) delete []p; }
	
	bool operator ! (){return (size==0);} // 데이터 개수가 0개인 경우 true 반환 
	int operator >>(int &avg){ // avg 구하기(오른쪽 피연산자의 공간을 참조로 매개받음) 
		int sum=0;
		for(int i=0;i<size;i++) sum+=p[i];
		avg = sum/size; // 해당 공간에 sum/num 저장 
	}
	Statistics& operator << (int n){ // op를 객체의 요소로 삽입 
		if(size==capacity){ // 이미 들어있는 요소의 개수가 capacity에 도달했다면 
			capacity*=2; // capacity를 2배로 늘림 
			int *q=new int[capacity]; // 임시 포인터 q에 capacity만큼 동적 할당 
			for(int i=0;i<size;i++)
				q[i]=p[i]; // size까지 q에 기존 p를 옮기도록 한다. 
			p=q; // p의 주소를 q의 주소로 되바꾸고 
			delete []q; // 임시로 만들었던 q에 대해서는 모두 메모리 삭제 
		}
		p[size]=n; // 새로운 size부터 요소 대입
		size++;
		
		return *this; // 새로운 자기 자신 객체 갱신 
		
	}
	void operator ~ (){ // 출력
		 for(int i=0;i<size;i++) cout<<p[i]<<' ';
		 cout<<endl;
	}
};

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]; // x를 통계 객체에 삽입
	stat<<100<<200; // 통계 객체에 삽입
	~stat; // 통계 데이터 모두 출력 
	
	int avg;
	stat>>avg; // 통계 객체로부터 평균 받음
	cout<<"avg = "<<avg<<endl; 
}

 

728x90
반응형
Comments