아니요, 참조 번호를 다시 입력 할 수 없습니다.
고려 :
int a = 42, b = 43;
int &ar = a;
ar = b;
방법 컴파일러는 당신이 b
을 참조 ar
를 다시 장착하려고하는 것을 알고, 그리고 값 43
에 a
의을 설정할 수 없습니다?
이 "문제"는 참조가 아닌 포인터를 사용하여 해결할 수 있습니다.
편집 :
확인이 그래서 내가 당신이 잘하는 참조 클래스에 할당 연산자를 사용할 수 없습니다 말했다 해요, 당신의 편집 당. 그런데 왜 비주얼 스튜디오가 나에게 해줄까요? 프로그램이 실행됩니다.
결론의 전제가 잘못되었습니다. 은 참조가 포함 된 클래스에서 대입 연산자를 사용합니다. 당신이 할 수없는 것은 참조를 다시 앉는 것입니다. 위의 코드에서 설명한 것처럼 ar = a;
을 사용하여 참조를 다시 할당하려는 경우 ar
을 다시 앉지 않고 ar
이 참조하는 값을 변경합니다.
Visual Studio "어렵지 않게 할 수 있습니다". 오해는 Visual Studio에서 내리는 것입니다.그것은 당신이 참조를 다시 자리 잡도록 두지 않습니다. 그것은 당신이 참조의 가치를 바꾸게합니다. 이것이 의미하는 바를 분명히 해줄 수있는 예가 나와 있습니다.
는
#include <iostream>
#include <string>
using namespace std;
class Foo
{
public:
void dump() const
{
cout << "Foo instance " << showbase << this << "\n";
}
};
class Bar
{
public:
Bar(Foo& foo) : foo_(foo) {}
Bar& operator=(const Bar& rhs)
{
foo_ = rhs.foo_;
return * this;
}
void dump() const
{
cout << showbase << "Bar instance " << this << "\t";
foo_.dump();
}
private:
Foo& foo_;
};
int main()
{
cout << "foo1: ";
Foo foo1;
foo1.dump();
cout << "foo2: ";
Foo foo2;
foo2.dump();
cout << "bar1 :";
Bar bar1(foo1);
bar1.dump();
cout << "bar2 :";
Bar bar2(foo2);
bar2.dump();
bar2 = bar1;
cout << "bar2 after assign :";
bar2.dump();
}
코드는 상기 2 Foo
개체 (foo1
및 foo2
)를 설정하고, 다른 Foo
참조를 각각 갖는 2 개 Bar
객체를 생성한다. Bar
는 다음 실행하는, operator=
이있다 : C++이 방법으로 당신이 다시 시트 참조를 허용하는 경우
는
foo_ = rhs.foo_;
, foo_
지금 Foo
의 다른 인스턴스를 참조한다. 하지만 그렇지 않습니다. 이것은 foo_
이 참조하는 것을 변경하지 않습니다. 대신 Foo
에서 operator=
을 호출합니다. 위의 코드를 실행하면 bar2
에있는 Foo
의 주소가 변경되지 않습니다. 참조를 다시 앉을 수 있다면 변경 될 것입니다.
사이드 노트 : 복사 스왑 관용구를 사용하면 '& rhs! = this' 체크가 중복됩니다 (http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap- 관용구). –
@SirYakalot : 내 편집을 참조하십시오. 나는 이것이 당신을 위해 일들을 명확히하기를 바랍니다. –