C++초보인데요;; 객체배열 모르겟어서 ㅠㅠ

kldpgk의 이미지

#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;

이런식의 소스를 보았는데요 책을 읽다가 도중에

지워도 됨 이라고 주석 달린건 제가 필요없어서 지워서 실행 해보았는데

잘되더라고여..그래서 그런데 책에서는 왜 저걸 굳이써줬나 이해가 않되서요 ^^;;

chadr의 이미지

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.

kewlbear의 이미지

위의 예제에서는 기본 생성자를 쓰지 않기 때문에 필요 없습니다.
참고로 변수명 앞에 밑줄(underscore)은 쓰지 않는 것이 좋습니다. 차라리 뒤에 붙이세요.
그리고 예제의 생성자도 아래 처럼 바꾸는 것이 좋습니다.

Point(int x, int y) : x_(x), y_(y) {}

이런 내용이 나와있지 않다면 그 책은 버리시고 다른 좋은 책을 구하시는 것이 좋을 것 같습니다.

pok의 이미지

변수명을 _x 식으로 쓰지 않는것은 것은 어떤이유인가요?
파이썬 처럼 변수삭제순서가 있는것도 아니고요.
또한 유명한 누군가가 함수입력값에 _변수, private 변수에 변수_ 라고 쓰자고 했었는데, 저는 그것이 굉장히 마음에 들어서 쭉 그렇게 쓰고 있거든요.

어떤 이유가 있나요?

lovewar의 이미지

Point(int x, int y) : x_(x), y_(y) {}

의 코드를 아래와 같이 완성해 보았습니다.

class Point
{
public:
Point(int x,int y) x_(x), y_(y)  {}
 
private :
  int x_;
  int y_;
 
};

지워도 된다는 개념은

 Point * arr[5];

부분에서의 문제를 지적한것 같습니다.
이를 해석하면, Point형의 주소를 5개 갖는 배열형입니다.
즉, Point형의 주소객체가 5개 생성됩니다.

다음과 같이 기술하면 생성자 미정의(no matching function for call to `Point::Point()) 오류메세지를 확인할 수 있습니다.

#include <iostream>
 
using namespace std;
 
class Point
{
int x;
int y;
 
public:
Point(int _x,int _y)
{
x=_x;
y=_y;
 
}
int GetX(){return x;}
int GetY(){return y;}
};
 
int main(void)
{
     Point arr[5];
 
     /* 생략 */
     return 0;
}

fanta1의 이미지

먼저 Class Point에서
Point()
{
...
}
이 부분은 생성자 부분으로 지우면 컴파일러가 아래와 같은 코드를 넣어 컴파일 합니다.
Point()
{
}
즉 아무일도 하지 않는 부분이지요... 생성자는 Class의 객체를 생성할때 반드시(없으면 위에서 처럼 만들어서라도...)실행되는 부분입니다. 따라서 지워도 되지요. 실행은 됩니다만, 책에서는 실행 과정 중에 어떤 부분에서 이 생성자가 실행되는지 확인 하려고 문자열을 넣은 것 같습니다.

두번째 void SetX(int _x) { x = _x;} 이 부분은 x변수의 경우 개별 멤버 데이터(private member data)이므로 직접 접근할 수 없고, 멤버 메소드를 통해서 접근 할 수 있기때문에 사용된 메소드고요... 프로그램 상에서 아직 사용되지 않고 있기때문에 지워도 작동 되는 것입니다..ㅡ,.ㅡ;

답변이 돼셨기를...

그것이 알고 싶당~

다른초보의 이미지

제가알기로 앞에 _ 가 붙는 변수명은 컴파일러 제작자들을 위해 예약되어있습니다. _ 가 앞에 붙은 변수명을 썼다가 그게 우연히 특정 컴파일러에서 사용하는 변수명과 중복될 경우 이해할 수 없는 에러가 나서 고생하게 될수도 있습니다...

kewlbear의 이미지

윗분 말씀처럼 변수명 앞에 _을 붙이는 것은 컴파일러 제작자 등에게 제한 되어 있습니다. 그 밖의 사람이 사용하는 경우는 C++ 표준에서는 undefined로 되어있기 때문에 어떻게 된다는 보장이 없습니다. 일반적으로 별 문제 없는 경우가 많지만 우연히 해당 컴파일러의 표준 라이브러리에서 사용하는 것과 같아서 문제가 발생해도 라이브러리 제작자는 아무 책임이 없습니다. 심지어 어떤 유명한 저자는 이렇게 표준에서 undefined로 정한 경우가 발생하면 하드디스크를 포맷해도 아무 책임이 없다고까지 농담삼아 쓰고 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.