c++ class static function 에 관한 내용

gyxor의 이미지

#include<iostream> 
using namespace std; 

class tri 
{ 

    private: 
    int z;
    
    public: 

	static int x; 
	
	tri()
	{
	z = 30;
	}
    
	static int& e() static  // (0)    
	{
		// cout << z;      에러(1)  
		return x;
	}
	static tri& k() 
	{
		//cout << (*this).z;  에러 (4)
		
		cout << "e";
		return (*this);  //에러 (5)
	}
	
};  
int tri:: x = 10;

int main() 
{
    static tri a;        //(2)
    static int &q=a.e(); //(3)
	cout << a.x;
	q = 100;             // q값 수정 
	cout << a.x;
    a.k();	
    return 0;
} 

첫째,
(0) 번에서 함수 뒤쪽의 static 은 무엇을 의미하게 되는것인지 모르게습니다. 답변부탁드립니다.<--- 질문!!!!!
보충설명
C:\Djgpp\Study\Cpp1.cpp(20) : warning C4518: 'static ' : storage-class or type specifier(s) unexpected here; ignored
이런 경고내용이 나오기는 합니다. 무슨내용인지 모르겠습니다.

(2)에서 a객체를 static 으로 선언하지 않아도 에러가 나지않습니다.
따라서 이런 구문은 의미없는 구문인거 같기도 하구요 또 그렇게 만드는것도 이상합니다. 이런식의 구문이 되는거 같은데요
static int a;
static int b=a;
이런 식으로 해도 에러는 안나지만... 안쓰는거 같던데요..

둘째,
(3)번에서 static 이 없어도 에러가 나지 않습니다. 여기서의 static 의 의미가 무엇인지 궁금합니다. 없어도 전혀 이상없이 작동됩니다.아무래도
군더더기 같은데요...

셋째,
static을 리턴하는 함수에서는 this 포인터를 사용하면 에러가 납니다.
(4)처럼 this를 참조하거나.. (5) 처럼 리턴을 해도 에러가 나구요..
그런데 static 을 리턴값으로 잡아도 호출하는객체의 this포인터와는
전혀 무관한것이 아닌가요? this 포인터를 쓰도록 해도 static 의 의미는
퇴색되지 않는거 같은데요..
왜 이렇게 만들어 놓은것인지 이유를 모르겠습니다.

체스맨의 이미지

1. 함수 뒤쪽의 static 은 그 warining 에서 말하는 그대로 불필요해서 무시됐으므로 아무 의미가 없는겁니다. (2) 에서 static 으로 선언하지 않아도 에러가 나지 않는 것은 당연합니다. 이것은 C 나 C++ 책에서 storage class (기억 부류 ) 부분을 공부하시면 됩니다.

2. 거기서의 static 의 의미를 아시는 것은 1번의 답변과 동일합니다.

3. 클래스 내에서 사용한 static 메소드는, 클래스의 인스턴스가 없어도 사용될 수 있는 메소드 입니다. this 포인터가 존재하려면 인스턴스가 존재해야 하므로, static 메소드에서는 this 포인터를 사용할 수 없습니다.

다음 내용을 정확히 파악하시면 될 것 같네요.
(1) 기억 부류 : extern, static, auto, register
(2) 모듈 내 static 변수와 함수의 의미와 기능
(3) 클래스 내 static 멤버 변수화 메소드의 의미와 기능

Orion Project : http://orionids.org

댓글 달기

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