C++
7일차 정리
연산자 오버로딩
이전에는 friend로 바꿀 수 없는 가져온 멤버함수를 가져와서 바꿨으나
이번에는 직접 멤버함수에 넣어서 사용함
연산자 오버로딩 시 왼쪽에 있는 객체의 연산자를 사용하여 연산된다.
ex) if(ov1.operator == ov2) {}
컨트롤+h \ 모든걸 바꾸는 게 나옴
디버깅-
f11은 함수안으로 들어감
f10은 차례로진행
cnt ++
------------------------------------------------
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
class Point {
int x,y;
public:
Point(int a, int b){x=a; y=b;}
void print( ) { cout << "x = " << x << ", y = " << y << "\n"; }
bool operator == (Point tmp);
};
bool Point::operator==(Point tmp) {
if((this->x== tmp.x) &&(this->y==tmp.y))
return true;
else
return false;
}
void main() {
Point ov1(10,20), ov2(10,20);
if(ov1 == ov2)
cout << "같다." <<"\n";
}
----------실행결과
같다.
------------------
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
class Point {
int x, y;
public:
Point(int a, int b) { x = a; y = b; }
void print( ) { cout << "x = " << x << ", y = " << y << "\n"; }
bool operator < (Point tmp);
};
bool Point::operator < (Point tmp) {
if((x < tmp.x) && (y < tmp.y))
return true;
else
return false;
}
void main ( ) {
Point ov1(10,20), ov2(30,40);
if(ov1 < ov2) cout << "ov2이 크다." << "\n";
else cout << "ov1이 크다." << "\n";
}
----------실행결과
ov2이 크다.
------------- < 연산자와 !=연산자
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
/*
이전 예제를 수정하여 != , > 의 기능을 하는 연산자를 만드시오.
*/
class Point {
int x, y;
public:
Point(int a, int b) { x = a; y = b; }
void print( ) { cout << "x = " << x << ", y = " << y << "\n"; }
bool operator > (Point tmp);
bool operator != (Point tmp);
};
bool Point::operator > (Point tmp) {
if((x > tmp.x) && (y > tmp.y))
return true;
else
return false;
}
bool Point::operator != (Point tmp) {
if((x != tmp.x) && (y != tmp.y))
return true;
else
return false;
}
void main () {
Point ov1(10,20), ov2(30,40);
if(ov1 > ov2) cout << "ov1이 크다." << "\n";
else cout << "ov2이 크다." << "\n";
if(ov1 != ov2) cout << "같지 않다." << "\n";
else cout << "같다." << "\n";
---------------------------------------응용
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
/*
이전 예제를 수정하여 == , > , < 를 판별하도록 구성하시오
*/
class Point {
int x, y;
public:
Point(int a, int b) { x = a; y = b; }
void print( ) { cout << "x = " << x << ", y = " << y << "\n"; }
bool operator > (Point tmp);
bool operator == (Point tmp);
bool operator < (Point tmp);
};
bool Point::operator > (Point tmp) {
if((x > tmp.x) && (y > tmp.y))
return true;
else
return false;
}
bool Point::operator < (Point tmp) {
if((this->x < tmp.x) && (this->y < tmp.y))
return true;
else
return false;
}
bool Point::operator == (Point tmp) {
if((x == tmp.x) && (y == tmp.y))
return true;
else
return false;
}
void main () {
Point ov1(10,20), ov2(30,40);
if(ov1 > ov2) cout << "ov1이 크다." << "\n";
else cout << "ov2이 크다." << "\n";
if(ov1 < ov2) cout << "ov1이 작다." << "\n";
else cout << "ov2이 작다." << "\n";
if(ov1 == ov2) cout << "같다." << "\n";
else cout << "같지 않다." << "\n";
}
----------------결과값
ov2이 크다.
ov1이 작다.
같지 않다.
계속하려면 아무 키나 누르십시오 . . .
--------------------------
class Count{
int cnt;
public:
Count(){cnt = 0;}
Count(int n){cnt =n;}//생성자
int Getcnt(){return cnt;}
void operator ++(){++cnt;}
void operator --(){--cnt;}
};
void main () {
Count cou1(5), cou2;
++cou1; --cou2;
cout <<"cou1 : "<<cou1.Getcnt() <<"\n";
cout <<"cou2 : "<< cou2.Getcnt() <<endl;
}
-----------
cou1 : 6
cou2 : -1
-----------------------------예제
/*
멤버변수가 2개인 경우에 해당하는 ++ , -- 연산자를 처리하시오
void operator ++() // 전위
void operator ++(int) // 후위
*/
class calcu{
public:
int su;
int su2;
calcu(int n1, int n2){
su =n1;
su2 =n2;
}//생성자
void operator ++(){++su, ++su2;}
void operator ++(int);
void operator --(){--su, --su2;}
void operator --(int);
};
void calcu::operator++(int){
su++, su2++;
}
void calcu::operator--(int){
su--, su2--;
}
void main () {
calcu cou1(5, 2);
calcu cou2(5, 2);
++cou1; --cou2; //전위 연산
cout <<"cou1 : "<<cou1.su <<" "<<cou1.su2<<"\n";
cout <<"cou2 : "<<cou2.su <<" "<<cou2.su2<<"\n";
calcu cou3(5, 2);
calcu cou4(5, 2);
cou3++; cou4--; //후위 연산
cout <<"------▲전위--▼후위------"<<endl;
cout <<"cou3 : "<<cou3.su <<" "<<cou3.su2<<"\n";
cout <<"cou4 : "<<cou4.su <<" "<<cou4.su2<<"\n";
}
--------------실행결과
cou1 : 6 3
cou2 : 4 1
------▲전위--▼후위------
cou3 : 6 3
cou4 : 4 1
----------------------------------h
c의 string과 동일
strcmp 문자 비교 ->strncmp strsecurecmp가 보안적
strlen 문자 길이
strtok 문자 사이
strcat 문자 붙이는 것
------------------------------코드
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
using namespace std;
/*
연산자 오버로딩, 문자열 결합
*/
class String
{
private:
char *str;
public:
String();
String(char *s);
String operator+(String s);//멤버 변수
void printString();
};
String::String(){
str = new char[20]; //new 동적할당하여 메모리를 사용하겠다.
}
String::String(char *s){
str = new char[20];
strcpy(str, s); //문자열 복사 s를 복사해 str에 넣음
}
void String::printString(){
cout << str << "\n";
}
String String::operator+(String s){
String temp;
strcpy(temp.str, this->str);
strcat(temp.str, s.str); //s.str을 temp.str에 붙여줌
return temp;
}
void main () {
String str1("C++");
String str2("Language");//heap영역
String str3;
str1.printString();
str2.printString();
str3 = str1 + str2;
str3.printString();
}
-------------결과
C++
Language
C++Language
★★객체 안에있는 문자를 더했다
strcat를 이용해 쉽게처리 가능하나 객체를 더할 때는 다음과 같이해야 한다.
동적할당을 하지 않으면 메모리 가부하가 심하다.
-------------스트링 클레스(string class)
class String
{
private:
char *str;
public:
String();
String(char *s);
void operator+=(String s);//멤버 변수
void printString();
};
String::String(char *s){
str = new char[20];
strcpy(str, s);
}
void String::printString(){
cout << str << "\n";
}
void String::operator+=(String s){
strcat(this->str, s.str);
}
void main () {
String str1("C++");
String str2("Language");
str1.printString();
str2.printString();
str1 += str2;
str1.printString();
}
---------------------결과
C++
Language
C++Language
-------------'[]'연산자의 다중 정의 '[]' = 첨자연산자
[] 배열의 크기 안에 있는지 확인하기 위해 쓴다.
a[1] - 첨자 연산자도 두 개의 데이터가 있어야 계산가능
*(a+1)
strlen에 대한 간단한 설명
#include <string> //strcpy, strcat 헤더 파일이 필요
void main(){
char arr[10] ="abcd";
cout << strlen(arr)<<endl;
}
---------'[]'연산자를 활용한 오버로딩
#include "stdafx.h"
#include <iostream>
#include <conio.h> // Console input / output
#include <string> //strlen, strcat, strlen, strcmp
using namespace std;
class String{
private:
char *str;
public:
String(char *s);
~String();
char operator[](int num);
};
String::String(char *s){
str=new char[10];
strcpy(str, s);
}
String::~String(){
delete []str;
}
char String::operator[](int i){
if(i>strlen(str)||i<0)
{
cout<<"범위초과\n";
return ' ';
}
return str[i];
}
void main(){
String test("Language");
int i;
for(i=-1;i<10;i++)
cout <<test[i]<<"\n";
}
------실행결과
범위초과
L
a
n
g
u
a
g
e
범위초과
○ 첨자연산자를 이용하면 쉽게 불러올 수 있다
--------------------------------------
템플릿, 예외처리, 클래스 제대로 해본다.