C++초보인데요;; 객체배열 모르겟어서 ㅠㅠ
글쓴이: kldpgk / 작성시간: 월, 2006/05/01 - 12:22오전
#include
using std::cout;
using std::endl;
class Point
{
int x;
int y;
public:
Point() //지워도됨
{
cout
x=y=0;
} //여기까지 지워도됨
Point(int _x,int _y)
{
x=_x;
y=_y;
}
int GetX(){return x;}
int GetY(){return y;}
void SetX(int _x){x=_x;}//지워도 실행됨
void SetY(int _y){y=_y;}//지워도 실행됨
};
int main()
{
Point *arr[5];
for(int i=0; i
{
arr[i]= new Point(i*2, i*3);
}
for(int j=0; j {
cout GetX() cout GetY()
}
return 0;
이런식의 소스를 보았는데요 책을 읽다가 도중에
지워도 됨 이라고 주석 달린건 제가 필요없어서 지워서 실행 해보았는데
잘되더라고여..그래서 그런데 책에서는 왜 저걸 굳이써줬나 이해가 않되서요 ^^;;
Forums:
Point()
Point() //지워도됨
{
cout<<" point() call! "<
x=y=0;
} //여기까지 지워도됨
라고 되어있는 부분은 Point라는 클래스의 기본 생성자입니다. 그런데 위의 프로그램에서 기본생성자를 이용해서 객체를 생성하는게 아니라
Point(int _x,int _y)
라는 생성자를 이용해서 객체를 생성하고 있습니다.
즉.. Point()라는 기본생성자를 프로그램에서 사용하고 있지 않기 때문에 프로그램이 정상적으로 실행되는 것입니다.
그리고
void SetX(int _x){x=_x;}//지워도 실행됨
void SetY(int _y){y=_y;}//지워도 실행됨
라고 되어있는 부분 또한 프로그램에서 사용하고 있지 않기 때문에 삭제해도 정상적으로 프로그램이 작동하는 것입니다.
제가 생각하기로는 책에서 기본생성자가 아닌 다른생성자를 이용해도 객체가 생성된다는 것을 의미하는것 같습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
위의 예제에서는
위의 예제에서는 기본 생성자를 쓰지 않기 때문에 필요 없습니다.
참고로 변수명 앞에 밑줄(underscore)은 쓰지 않는 것이 좋습니다. 차라리 뒤에 붙이세요.
그리고 예제의 생성자도 아래 처럼 바꾸는 것이 좋습니다.
Point(int x, int y) : x_(x), y_(y) {}
이런 내용이 나와있지 않다면 그 책은 버리시고 다른 좋은 책을 구하시는 것이 좋을 것 같습니다.
변수명을 _x 식으로
변수명을 _x 식으로 쓰지 않는것은 것은 어떤이유인가요?
파이썬 처럼 변수삭제순서가 있는것도 아니고요.
또한 유명한 누군가가 함수입력값에 _변수, private 변수에 변수_ 라고 쓰자고 했었는데, 저는 그것이 굉장히 마음에 들어서 쭉 그렇게 쓰고 있거든요.
어떤 이유가 있나요?
poklog at http://poksion.cafe24.com/poklog/
혼동이 있을것 같아.
의 코드를 아래와 같이 완성해 보았습니다.
지워도 된다는 개념은
부분에서의 문제를 지적한것 같습니다.
이를 해석하면, Point형의 주소를 5개 갖는 배열형입니다.
즉, Point형의 주소객체가 5개 생성됩니다.
다음과 같이 기술하면 생성자 미정의(no matching function for call to `Point::Point()) 오류메세지를 확인할 수 있습니다.
지워도 되는 부분은 생성자와 개별 멤버 데이터를 셋하는 메소드입니다.
먼저 Class Point에서
Point()
{
...
}
이 부분은 생성자 부분으로 지우면 컴파일러가 아래와 같은 코드를 넣어 컴파일 합니다.
Point()
{
}
즉 아무일도 하지 않는 부분이지요... 생성자는 Class의 객체를 생성할때 반드시(없으면 위에서 처럼 만들어서라도...)실행되는 부분입니다. 따라서 지워도 되지요. 실행은 됩니다만, 책에서는 실행 과정 중에 어떤 부분에서 이 생성자가 실행되는지 확인 하려고 문자열을 넣은 것 같습니다.
두번째 void SetX(int _x) { x = _x;} 이 부분은 x변수의 경우 개별 멤버 데이터(private member data)이므로 직접 접근할 수 없고, 멤버 메소드를 통해서 접근 할 수 있기때문에 사용된 메소드고요... 프로그램 상에서 아직 사용되지 않고 있기때문에 지워도 작동 되는 것입니다..ㅡ,.ㅡ;
답변이 돼셨기를...
그것이 알고 싶당~
제가알기로 앞에 _ 가
제가알기로 앞에 _ 가 붙는 변수명은 컴파일러 제작자들을 위해 예약되어있습니다. _ 가 앞에 붙은 변수명을 썼다가 그게 우연히 특정 컴파일러에서 사용하는 변수명과 중복될 경우 이해할 수 없는 에러가 나서 고생하게 될수도 있습니다...
윗분 말씀처럼
윗분 말씀처럼 변수명 앞에 _을 붙이는 것은 컴파일러 제작자 등에게 제한 되어 있습니다. 그 밖의 사람이 사용하는 경우는 C++ 표준에서는 undefined로 되어있기 때문에 어떻게 된다는 보장이 없습니다. 일반적으로 별 문제 없는 경우가 많지만 우연히 해당 컴파일러의 표준 라이브러리에서 사용하는 것과 같아서 문제가 발생해도 라이브러리 제작자는 아무 책임이 없습니다. 심지어 어떤 유명한 저자는 이렇게 표준에서 undefined로 정한 경우가 발생하면 하드디스크를 포맷해도 아무 책임이 없다고까지 농담삼아 쓰고 있습니다.
댓글 달기