#include<iostream>
using namespace std;
/*
//주제 9 상수 함수의 개념
//1. 개념 : 모든 멤버를 상수 취급하는 함수
//2. 상수 객체는 상수 함수만 호출 할 수 있다.
//
class Point
{
public :
int x,y;
Point(int a=0,int b=0):x(a),y(b){}
void Set(int a){x=a;}
void print() //const 는 아래 주석때문에라도 꼭 붙여야 한다.
{
//x=10; //error 함수안에서 모든 멤버는 상수이다.
cout << x << ","<<y<<endl;
}
};
int main(){
const Point p(1,2);
//p.x=10; //error 나와야 한다.
//p.Set(20); //error 나와야 한다
//
//p.print(); // 호출 될 수 있으려면 반드시 print() 는 상수 함수로 해야 한다.
}
*/
//10 Const 와 Const 아닌것의 차이
// 우리는 상수 객체를 안만듭니다?! 그렇다면 이건 어떠냐!
// 멤버 함수가 data의 값을 변경하지 않는다면 반드시 상수 함수로 해야한다.
//상수 함수는 선택이 아닌 필수이다.
///////////////////////////////////////////////////////////////////
class Rect{
int x,y,w,h;
public :
//int GetArea(){return w*h;} //Rect 에 const 를 붙이면 반드시 여기도 붙여야 출력이 된다.
int GetArea() const{return w*h;}
};
//void foo( Rect &r){ //이걸 하게되면 객체가 변한다! 헐킈
void foo(const Rect &r){ //그래서 이걸 쓸수 밖에 없다! 그렇다면 getArea도 붙여줄 수 밖에없다.
int n = r.GetArea();
}
int main(){
Rect r;
foo(r);
int n=r.GetArea();
}
=============================================================================================================
#include<iostream>
using namespace std;
//상수함수 2
//1. 논리적 상수성!! (밖에서 보기엔 상수인데 논리적으로 내부 루틴은 상수가 아닌 현상
// 해결책!!
// (A) mutable : 상수 함수 안에서도 값을 변경할 수 있는 멤버 data
// (B) 변하는 것과 변하지 않는 것은 분리해야 한다.
// 변하는 것을 다른 구조체로 뽑아 낸다.
/*
//(A) 클래스
class Point{
int x,y;
mutable char cache[32];
mutable bool cache_valid;
public :
Point(int a=0,int b=0):x(a),y(b),cache_valid(false){}
//객체를 문자열로 반환하는 함수 - > javam c# 에 있는 개념
char * toString() const
{
//static char s[32]// tjdsmd wjgkfmf dnlgks qkdwl
//sprintf(s,"%d,%d",x,y);
if(cache_valid ==false){
sprintf(cache,"%d,%d",x,y);
cache_valid = true;
}
return s;
}
};
int main(){
const Point p(1,2);
cout << p.toString()<<endl;
cout << p.toString()<<endl;
}
*/
/*
//(B) 클래스
//변하는것과 변하지 않는것은 분리 되어야한다.
// 이로써 mutable 을 사용하지 않고
//변하지 않는 변수들은 클래스로 뭉치고 변하는 값들은 구조체포인터로 빠진다.
struct Cache{
char cache[32];
bool cache_valid;
}
class Point{
int x,y;
Cache * pCache;
public :
Point(int a=0,int b=0):x(a),y(b){
pCache = new Cache;
}
//객체를 문자열로 반환하는 함수 - > javam c# 에 있는 개념
char * toString() const
{
//static char s[32]// tjdsmd wjgkfmf dnlgks qkdwl
//sprintf(s,"%d,%d",x,y);
if(pCache->cache_valid ==false){
sprintf(pCache->cache,"%d,%d",x,y);
pCache->cache_valid = true;
}
return pCache->cache;
}
};
int main(){
const Point p(1,2);
cout << p.toString()<<endl;
cout << p.toString()<<endl;
}*/
///////// 2. 문법정리 //////////////
class Test{
public :
//동일 이름의 상수, 비상수 함수를 동수에 만들수 있다.
void foo(){}
void foo() const{}
void goo() const;
};
void Test::goo() const{} //반드시 붙여야 같은 상수 함수로 인식한다.
int main()
{
Test t1;
t1.foo(); //1번, 없다면 2번 유드리 있게 변함
const Test t2;
t2.foo(); //2번, 없다면 에러이다.
}
'C,C++ > Android_FrameWork' 카테고리의 다른 글
[SSM 안드로이드 프레임워크 개발 강의]10. 멤버함수 호출의 정리 (0) | 2012.08.13 |
---|---|
[SSM 안드로이드 프레임워크 개발 강의]9.템플릿으로 알아보는 싱글톤 패턴 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의]7. 생성자 이야기 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의]6. 객체 지향의 탄생 배경을 STACK 소스로 알아보기 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의 ] 5. 참조변수 편 (0) | 2012.08.13 |