본문 바로가기

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 더보기
MFC Class 삭제 하는 방법 - 생성한 Class를 간단히 완전제거 MFC (1) 프로젝트에 보면 *.clw 화일이 클래스정보를 가지고 있거든요 첫번째) "FileView"에서 클래스에 대한 화일을 제거 두번째) 그 화일이 있는 폴더로 가서 화일 제거 세번째) 그 화일의 내용을 가지고 있었던 프로젝트로 가서 clw화일을 제거 그 후 다시 똑같은 이름의 클래스를 생성하시면 똑같은 클래스 이름이 있다는 에러 메세지가 안뜰겁니다. clw화일을 만들려면 클래스 위자드(Ctrl + w : 비쥬얼 스튜디오 6 기준)를 누른 후 clw화일이 제거된 프로젝트로 이동하시면 파일이름을 넣으라고 나오는데 그때 clw화일의 이름을 확장자와 함께 넣으시면 됩니다. - 생성한 Class를 간단히 완전제거 MFC (2) 간단한 예로 설명을 시작하자면, 우선 .. 더보기
컨트롤 핸들 얻기 컨트롤 핸들 얻어오기 CWnd::GetDlgItem 함수의 원형 CWnd *GetDlgItem(int nID) const; 2. 초...간단......하게..ㅡ.ㅡ ㅋㅋㅋㅋㅋㅋ 더보기