2010-11-20 4 views
2

저는 C++을 연구 중이며, 특히 참고 문헌에 대해 언급하지 않았습니다. 내 질문에 당신의 가장 사소한 것 있다면 죄송하지만 나는이 프로그램의 출력을 이해하고 싶습니다 :참조에 의한 전달에 대한 의문점

#include <iostream> 

using namespace std; 

struct myStruct 
{ 
    int a; 
    int b; 
}; 
typedef struct myStruct myStruct; 

myStruct copyMyStruct(myStruct& source) 
{ 
    myStruct dest; 
    dest.a=source.a; 
    dest.b=source.b; 
    return dest; 
} 

myStruct otherCopyMyStruct(myStruct& source) 
{ 
    myStruct dest; 
    dest=source; 
    return dest; 
} 

myStruct& GetRef(myStruct& source) 
{ 
    return source; 
} 

void printMyStruct(string name,const myStruct& str) 
{ 
    cout<<name<<".a:"<<str.a<<endl; 
    cout<<name<<".b:"<<str.b<<endl; 
} 

myStruct one,two,three,four; 
myStruct& five=one; 

void printStructs() 
{ 
    printMyStruct("one",one); 
    printMyStruct("two",two); 
    printMyStruct("three",three); 
    printMyStruct("four",four); 
    printMyStruct("five",five); 
} 

int main() 
{ 
    one.a=100; 
    one.b=200; 

    two=copyMyStruct(one); 
    three=otherCopyMyStruct(one); 
    four=GetRef(one); 


    printStructs(); 

    cout<<endl<<"NOW MODIFYING one"<<endl; 

    one.a=12345; 
    one.b=67890; 

    printStructs(); 

    cout<<endl<<"NOW MODIFYING two"<<endl; 

    two.a=2222; 
    two.b=2222; 

    printStructs(); 

    cout<<endl<<"NOW MODIFYING three"<<endl; 

    three.a=3333; 
    three.b=3333; 

    printStructs(); 

    cout<<endl<<"NOW MODIFYING four"<<endl; 

    four.a=4444; 
    four.b=4444; 

    printStructs(); 


    cout<<endl<<"NOW MODIFYING five"<<endl; 

    five.a=5555; 
    five.b=5555; 

    printStructs(); 

    return 0; 
} 

출력은 다음과 같습니다

one.a:100 
one.b:200 
two.a:100 
two.b:200 
three.a:100 
three.b:200 
four.a:100 
four.b:200 
five.a:100 
five.b:200 

NOW MODIFYING one 
one.a:12345 
one.b:67890 
two.a:100 
two.b:200 
three.a:100 
three.b:200 
four.a:100 
four.b:200 
five.a:12345 
five.b:67890 

NOW MODIFYING two 
one.a:12345 
one.b:67890 
two.a:2222 
two.b:2222 
three.a:100 
three.b:200 
four.a:100 
four.b:200 
five.a:12345 
five.b:67890 

NOW MODIFYING three 
one.a:12345 
one.b:67890 
two.a:2222 
two.b:2222 
three.a:3333 
three.b:3333 
four.a:100 
four.b:200 
five.a:12345 
five.b:67890 

NOW MODIFYING four 
one.a:12345 
one.b:67890 
two.a:2222 
two.b:2222 
three.a:3333 
three.b:3333 
four.a:4444 
four.b:4444 
five.a:12345 
five.b:67890 

NOW MODIFYING five 
one.a:5555 
one.b:5555 
two.a:2222 
two.b:2222 
three.a:3333 
three.b:3333 
four.a:4444 
four.b:4444 
five.a:5555 
five.b:5555 

내 질문 : 왜하지를 "2", "3"및 "4"의 변화는 "하나"에 변화를 가져 오는가?

"two"와 "three"는 어떻게 될지 추측 할 수 있습니다. 아마도 회원이 새로 만든 변수를 복사하는 것이지만 "four"의 변경 사항이 "one"에 반영되지 않은 이유는 모르겠습니다. "(및"5 ") : 결국 GetRef 함수에서 참조를 반환합니다 ....

미리 감사드립니다!

+0

GetRef는 같은 것을 반환하지만 'four'에 할당하면 어떻게됩니까? 그것은 ref가 아닙니다 ... –

답변

8

변수 four은 참조가 아닌 개체입니다.

참조에서 할당 할 때 four=GetRef(one);, four은 참조로 변환되지 않습니다. 할당은 참조에 의해 참조되는 모든 것을 복사합니다 (이 경우 참조는 one 임). 그 후에는 물체와 관련이 없습니다. 따라서 four = GetRef(one);four = one;과 동일한 효과를 나타냅니다.

myStruct &five = one;은 참조 (객체가 아님)로 five을 선언하고 객체 one을 참조에 바인딩합니다. 따라서 five이라는 이름과 one이라는 이름은 같은 개체를 참조합니다. 즉, 두 이름 중 하나를 사용하여 변경 한 내용은 다른 이름을 사용하여 볼 수 있습니다.

그런데 C++에서는 typedef struct myStruct myStruct;의 [*] 필요가 없습니다. C++에서 클래스 유형은 이름으로 참조 할 수 있으며 구조체 클래스입니다.

[*] 클래스와 동일한 이름의 함수가있는 이상한 구석의 경우를 제외하고는 매개 변수가 해당 클래스의 일부 생성자 매개 변수와 호환됩니다. 그런 다음 Foo 함수와 Foo의 생성자 호출 사이에 표현식 Foo(x,y)이 모호 할 것이라고 생각할 수 있습니다. 그러나 typedef가 없으면 C가 함수를 선택하므로 C와의 호환성을 위해 C++에서도 동일한 작업을 수행합니다. 대부분의 사람들은이 케이스가 C++로 typedef를 작성하기에 충분하다고 생각하지 않습니다.

+0

좀더 자세하게 말해서, 'four = GetRef (one)'이 대입 연산자 인 myStruct :: operator = (myStruct & copyfromthis)를 호출한다고합니다. 할당 연산자를 정의하지 않으면 컴파일러는 기본적으로 멤버별로 복사본을 만드는 것을 만듭니다. – Crashworks

+0

예. 이 경우, 위와 같이 할당이 객체를 복사하지만,'operator ='을 오버로드하는 클래스의 경우 할당은 오버로드가 정의한 것을 수행합니다. –

0

copymystruct가 '값'을 반환하기 때문에. 값으로 반환되고 별도의 개체 인 결과에 할당 된 별도의 임시 개체를 만드는 작업이 포함됩니다.

관련 문제