일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 시스템호출
- 카카오
- 카카오 코테
- Spring
- python
- C언어
- nestJS
- OpenCV
- spring boot
- nestjs typeorm
- 코테
- thymeleaf
- 코딩테스트
- 구조체배열
- 파이썬
- 프로그래머스
- git
- 컴포넌트스캔
- C++
- @Component
- Nodejs
- nestjs auth
- @Autowired
- 카카오 알고리즘
- 가상면접사례로배우는대규모시스템설계기초
- 해시
- TypeORM
- 알고리즘
- 스프링
- AWS
Archives
- Today
- Total
공부 기록장 💻
명품 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
반응형
'# Language & Tools > C++' 카테고리의 다른 글
Comments