2008년 04월 21일
[열혈강의c++]6장 static멤버와 const멤버
const맴버
const double PI=3.14;
PI=3.1415;//compile error
const int val;
val =20; //compile error
int n =10;
const int *pN=&n;
*pN=20; //compile error
이경우는 pn포인터가 가리키는 n값이 상수화된것임
int n1=10;
int n2=20;
int *const pN=&n1;
*pN=20;
pn=&n2; //compile error
이경우는 pn포인터(주소값)이 상수화된거임..
그렇담 c++에서는 어떻게 될까?
가령
class A
const int a;
public:
void test(int _a)
{
a=_a;
}
이경우에서 main에서 객체를 생성했다고 가정하면
일단 객체를 생성할때 맴버들에 대한 메모리를 구성해준다..(스택작업)
이때 const선언된 녀석은 쓰레기값이 초기화 되므로 컴파일단에 에러가 난다
이럴때는 void test(int _a):a(_a)
이런식으로 해주면 해결 이건 걍 const쓸때 초기화 하고 싶을때 위와같이
쓰면 된다...그리공...함수의 const
c++에서는 함수 const할때 중간에 선언한다 이런식으로
void test(int _a) cont 이렇게 하면 함수가 상수화 된것이다...
그런데....두가지 유의사항이 있다
첫번째는 저렇게 상수화된 함수에서 멤버 변수를 조작하면
컴파일 에러가 나는것과
void test(int _a) const
{
show();
}
void show()
{
cout<<"babo"<<endl;
}
이렇게 하면 에러일까 아닐까?
(응 ? 멤버변수도 안건드리는데?)
그래도 컴파일 에러이다...왜냐면
test함수에서 show를 부를때..컴파일단에서는
어떻게 체크하냐면 show라는 함수가 const선언 되었냐 안되었냐를 판단한다..
즉 show란 함수 안에서 멤버변수를 조작체크하는게 아니라
만약 show란 함수가 const되있다면이라는 식이다...
위를 컴파일 단에서 고칠려면
void show() const 이렇게 하면 된다는 뜻이다...
static 일반적으로 사용할땐
지역변수를 전역으로 만들때 사용한다...
주로 이런식으로 씀
class AAA
static int a=1;
어쩌고 저쩌고
int AAA:a=1; //static변수 초기화...
여기서 클래스내에서 static을 선언했다면 객체 생성시 static변수가 할당되므로
이렇게 클래스 외부에서 초기화를 한다는 의미는
static특성상 main함수 호출이전에 메모리에 초기화 한다는 의미이다..
새로운 키워드 explicit,mutable
explicit는 명시적 호출만 허용한다는 의미이다
일반적으로 객체를 생성할때
AAA a1=10; //이것은 C스타일이다
AAA a1(10); //이것은 C++스타일이다
C++스타일은 묵시적으로 C스타일을 내부적으로 호출하게 된다...
여기서 맴버 함수에
가령 생성자 함수를
explicit AAA를 선언하게 되면 첫번째 C스타일은 에러를 발생하게된다..
mutable 이건 자주 쓰지말라고 하던데...일단 간략하게
const한 함수에서는 멤버변수의 조작을 할수 없다 하지만
멤버변수에 mutable을 선언하게 된다면 조작을 할수 있다..
이렇게 조작하기 보다는 const를 이용하는 함수 따로
아닌 함수 따로 분리하는게 더좋단다...-_-;
const double PI=3.14;
PI=3.1415;//compile error
const int val;
val =20; //compile error
int n =10;
const int *pN=&n;
*pN=20; //compile error
이경우는 pn포인터가 가리키는 n값이 상수화된것임
int n1=10;
int n2=20;
int *const pN=&n1;
*pN=20;
pn=&n2; //compile error
이경우는 pn포인터(주소값)이 상수화된거임..
그렇담 c++에서는 어떻게 될까?
가령
class A
const int a;
public:
void test(int _a)
{
a=_a;
}
이경우에서 main에서 객체를 생성했다고 가정하면
일단 객체를 생성할때 맴버들에 대한 메모리를 구성해준다..(스택작업)
이때 const선언된 녀석은 쓰레기값이 초기화 되므로 컴파일단에 에러가 난다
이럴때는 void test(int _a):a(_a)
이런식으로 해주면 해결 이건 걍 const쓸때 초기화 하고 싶을때 위와같이
쓰면 된다...그리공...함수의 const
c++에서는 함수 const할때 중간에 선언한다 이런식으로
void test(int _a) cont 이렇게 하면 함수가 상수화 된것이다...
그런데....두가지 유의사항이 있다
첫번째는 저렇게 상수화된 함수에서 멤버 변수를 조작하면
컴파일 에러가 나는것과
void test(int _a) const
{
show();
}
void show()
{
cout<<"babo"<<endl;
}
이렇게 하면 에러일까 아닐까?
(응 ? 멤버변수도 안건드리는데?)
그래도 컴파일 에러이다...왜냐면
test함수에서 show를 부를때..컴파일단에서는
어떻게 체크하냐면 show라는 함수가 const선언 되었냐 안되었냐를 판단한다..
즉 show란 함수 안에서 멤버변수를 조작체크하는게 아니라
만약 show란 함수가 const되있다면이라는 식이다...
위를 컴파일 단에서 고칠려면
void show() const 이렇게 하면 된다는 뜻이다...
static 일반적으로 사용할땐
지역변수를 전역으로 만들때 사용한다...
주로 이런식으로 씀
class AAA
static int a=1;
어쩌고 저쩌고
int AAA:a=1; //static변수 초기화...
여기서 클래스내에서 static을 선언했다면 객체 생성시 static변수가 할당되므로
이렇게 클래스 외부에서 초기화를 한다는 의미는
static특성상 main함수 호출이전에 메모리에 초기화 한다는 의미이다..
새로운 키워드 explicit,mutable
explicit는 명시적 호출만 허용한다는 의미이다
일반적으로 객체를 생성할때
AAA a1=10; //이것은 C스타일이다
AAA a1(10); //이것은 C++스타일이다
C++스타일은 묵시적으로 C스타일을 내부적으로 호출하게 된다...
여기서 맴버 함수에
가령 생성자 함수를
explicit AAA를 선언하게 되면 첫번째 C스타일은 에러를 발생하게된다..
mutable 이건 자주 쓰지말라고 하던데...일단 간략하게
const한 함수에서는 멤버변수의 조작을 할수 없다 하지만
멤버변수에 mutable을 선언하게 된다면 조작을 할수 있다..
이렇게 조작하기 보다는 const를 이용하는 함수 따로
아닌 함수 따로 분리하는게 더좋단다...-_-;
# by | 2008/04/21 00:52 | 트랙백





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]