c++ 클래스에서 const 와 static 변수 선언에 관한내용 짧습니다

gyxor의 이미지

#include<iostream>
using namespace std;

class tri 
{
 private:
    static int x;              //<1>
    const  int y=10;        //<2> 
    static const int z=50; //<3>        
    
    public:
};
int tri:: x=555;
void main()
{
}

위 내용에서 1번의 경우엔 static 변수이므로 외부에서 따로

선언을 해주고요

나머지 const 변수가 들어가 있는 선언의 경우엔 클래스 안에서

선언이 가능하다고 책에 나와있는데요

왜 에러가 나는지 모르겠습니다.

또한 1>번의 경우에도 내부 선언이 가능할것 같은데요

이내용에 관한 설명 부탁드립니다.

맹고이의 이미지

Quote:
When you create an ordinary(non-static)const inside a class, you cannot
give it an initial value. This is initialization must occur in the constructor,
of course, but in a special place in the contsructor.
Because a const must be initialized at the point it is created,
inside the main body if the constructor the const must already be initialized.
Otherwise you're left with the choice of waiting until some point later in the
constructor body, which means the const would be un-initialized for a while.
also, there would be nothing to keep you from changing the value of the const
at various places in the constructor body.

Thinking in C++
P.353

헥헥.. 번역능력이 딸려서 그냥 그대로 올려봤습니다..

#include<iostream>
using namespace std;

class tri {
private:
    static int x;                    //<1>
    const  int y;                  //<2>
    static const int z = 50;    //<3>

public:
    tri(int yy);
};
tri::tri(int yy) : y(yy) {} 
int tri:: x = 555;
int main() {}

아시겠지만.. 이런식으로 초기화 해야겠네용

p.s. 흠냐 후다닥 적었더니 오탈자가 많아서 계속 고칩니다;;

clhitter의 이미지

위에 분이 2번 경우는 잘 설명해주신 것 같구요
1 번의 경우는 ODR (one definition rule)을 어기기 때 안되는 겁니다.
ODR라는 것은 전체 프로그램에서 변수, 함수 등은 한번만 정의(!) 되어야 한다는 규칙인데
header에
static int x = 555;
이렇게 정의가 되어 있다면 이 헤더를 #include 한 모든 translation unit에서 x 변수가 정의되므로 ODR을 어기게 되는 것이죠
3번 경우는 이것의 예외입니다. integral const의 경우는 메모리가 할당되는 변수로 처리하지 않고 마치 #define 처럼 컴파일 타임에서 상수로 치환을 해주면 ODR을 어디기 않을 수 있거든요 (이런걸 in-class static const integral initializer라고 합니다.)
원래는 3번이 맞는 문법인데 에러가 나는 것은 사용하시는 컴파일러가 VC6 처럼 in-class static const integral initializer를 지원하지 않기 때문인거 같네요 )

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.