본문 바로가기

Language/C++

이항연산자 오버로딩의 교환법칙 연산자 오버로딩 교환법칙 교환 법칙은 - 와 + 연산자에서 허용되는 법칙이다. 객체 끼리의 계산 또한 일반 상수와 연산을 하거나 교환 법칙을 사용해야 할 때가 있다. (A라는 클래스가 있고 priate에 x와y라는 변수가 있다고 가정하자.) A p1(1,2); A p2 = p1 + 3; 이 문장을 해결 하기 위해서는 연산자 오버로딩을 약간 변경 해야한다. 매개변수를 받아오는 부분에서 자신의 자료형인 A 클래스의 객체를 받는 것이 아니라 int 형 매개변수를 받아와야 한다는 것이다. 구현부는 다음과 같다. A operator+(int val) { A(p1.x + val, p1.y + val); return temp; } 하지만 만일 A p3 = 3 + p1; 이라는 코드를 추가했다고 가정하면 문제가 생기게.. 더보기
C++ 클래스의 임시 객체 임시 객체 기본적으로 C문법에서 int a = 3 + 5; 라는 코드를 입력하고 컴파일 하게 되면 a가 메모리에 올라가서 4바이트를 잡고 (32비트 운영체제 일때) 있다고 생각 하겠지만 실은 3과 5도 메모리에 올라가있다. 그래야 CPU가 처리를 하기 때문... 그럼 총 12바이트가 올라가게 되는데 a같은 경우는 함수가 끈날때 까지는 계속적으로 메모리에 로드되어 있지만 3 과 5는 저 라인이 끈나는 즉시 소멸 된다. 임시 객체는 이와 같다. 클래스 이름에 괄호를 치로 바로 멤버변수 값을 기제 하게 되는데 아래와 같다. #include #include class A { char name[20]; public: A(char* _name) { strcpy(name, _name); cout 더보기
단항 연산자 오버로딩 단항연산자 오버로딩 단항연산자 오버로딩은 이항연산자랑 조금의 차이를 보인다. 단항연산자는 피연산자가 하나 밖에 없기 때문에 멤버 함수는 메개변수를 받지 않는다. 또한 일반 전역 함수로 오버로딩을 하게 되면 메개변수는 하나만 받는것!(머...기본이지 이건.ㅋ) 하지만 차이를 보이는 부분이 상당하다. 기본적으로(A라는 클래스가 있고 x와y 멤버를 가지고 있다고 가정) 멤버 함수라고 한다면... A& operator++()//매개변수없다. 또한 리턴값이 레퍼런스이다. { x++; y++; return *this;//리턴값이 자기자신이다. 자기자신의 주소를 역참조 하기 때문이다! } 일반 전역 함수라고 한다면... 클래스 내부 friend A& operator++(A& p);//매개변수가 한개이다. 함수 부분 .. 더보기
연산자 오버로딩(전역함수) 연산자 오버로딩을 할때는 멤버함수로 연산자 오버로딩을 하지만 일반 전역 함수로도 연산자 오버로딩이 가능하다. 일반 전역 함수로 연산자 오버로딩을 할때는 반드시 필요한 키워드가 한개가 더 있다. 그것은 바로 friend^^ 이다~ 이유는 간단하다. private 영역을 외부에서는 접근허용을 하지 않게 되어있다. 하지만 객체끼리 연산은 반드시 모든 멤버를 연산하여야 된다는 조건이 붙게 되는데 그것을 가능케 해주는 것이 friend 키워드 이다. 사용법^^ 1.일반 전역 함수로 연산자 오버로딩을 하기 위해서 우선적으로 연산자 오버로딩을 하고자 하는 클래스에 friend 함수를 선언 해줘야 한다. (A라는 클래가 있고 private 에 int x,y 가 있다고 가정하자) friend A operator+(con.. 더보기
연산자 오버로딩(멤버함수) 연산자 오버로딩 class라는 사용자 정의 자료형을 가지고 =,+,-,*,/ 등의 연산을 하기 위함이다! 젠장 먼말인고 하니... int a = 10; int b = 10; 두개의 변수가 있다. 이를 int c; c = a + b; 를 하게 되면 전혀 틀린 문장(라인이 틀리다고 생각하자ㅡ,.ㅡ)이 아니다. 하지만...만약 이것이 기본 자료형이 아니라 클래스의 객체라면(참고로 클래스도 일종의 사용자 자료형이다^^) A라는 클래스가 있다고 가정 A a1(10); A a2(20); A a3(a1+a2); 별다른 작업 없이 이게 된다고 생각하면 개오산 이다.(오산이 지명이더군..ㅋㅋ) 정의 :객체간의 연산을 허용하기 위함이 연산자 오버로딩 이다. 연산자 오버로딩도 함수의 일종이다. 이를 잊지 말아야 하며, C나.. 더보기
복사생성자 (깊은 복사) 얕은 복사생성자 로는 한계가 있다는걸 알았다. 바로 메모리를 동적할당시 복사를 하게 되면 동적된 메모리의 주소를 공유 하게 되며, 복사가 이루어지고 소멸자 함수가 호출되면서 에러를 발생시킨다는 것이다. 얕은복사로 에러가 나는 코드를 수정하면 다음과 같다. #include #include class Person { char *name; char *phone; int age; public: Person(char* _name,char* _phone, int _age); Person(Person& p); ~Person(); void ShowData(); }; Person::Person(char* _name, char* _phone, int _age) { name = new char[strlen(_name)+1].. 더보기
복사 생성자(얕은 복사) 복사 생성자는 말그대로 복사를 하기위한 함수이다. 물론 묵시적인 호출로 복사가 이루어 지지만 객체 끼리의 복사는 디폴트 복사 생성자로만 복사를 할수 있는 부분이 한정되어있다. class Point { int x, y; public: Point(int _x,int _y)//복사하는 대상의 직접 접근이 불가능하다. { x = _x; y = _y; } Point(const Point& p)//복사하는 대상의 직접 접근이 가능하다. { x = p.x; y = p.y; } void ShowData() { cout 더보기
Friend 키워드 #include class Counter { private: int val; public: Counter() { val = 0; } void Print() { cout 더보기
순수 가상 함수와 추상 클래스 순수 가상 함수 와 추상클래스 순수 가상 함수란? 함수 오버라이딩을 한후 Base class 의 은닉된 함수를 완전히 가리기 위하여 virtual 키워드로 함수부를 완전히 가리게 된다. 하지만 함수의 바디(body) 부분을 여전히 기제를 해야하는데 이는 실로 엄청나게 번거로운 방법이고 코드도 늘어가게 된다. 실행도 되지 않는 함수때문에 함수의 몸체 부분을 (return 문장만 쓰더라도 블럭을 잡아야 하니까 ) 모두 기제해줘야 하기 때문이다. 그래서 virtual void a() = 0; 와 같은 형식으로 해더 부분을 변경하여 코드를 작성하면 컴파일은 이 함수가 가상 함수라는걸 알고 제어를 오버라이딩 된곳으로 바로 옴기게 된다. 이때 이 함수를 순수 가상 함수라고 한다. 왜냐하면 함수의 몸체가 없기때문에 .. 더보기
virtual 함수 virtual 함수 virtual 함수란 말그대로 가상의 함수이다. 가상이란 실제로 없는데 있는척 훼이크 쓰는거다. virtual 함수는 함수 오버라이딩이 반드시 있어야 하는데 간단하게 오버라이딩을 해보면.. #include class AAA { public: void a() { cout 더보기