2013-03-15 5 views
0

누군가 나에게 다음과 같은 구문을 이해하는 데 도움이 바랍니다 수 :C++에서 "x (y) = z (w)"는 무엇을 의미합니까?

aaa<bbb> object_name; 
func(object_name, object_name2); 
ccc<ddd>(object_name) = func2(arg1, arg2); 

는 이해 것을 먼저 우리가 aaa<bbb> 클래스의 새로운 객체를 선언합니다. 그런 다음이 객체를 다른 객체와 함께 사용하여 함수를 호출하면 object_name의 값이 변경 될 수 있습니다. 나는 세 번째 줄을 이해하는 데 어려움을 겪고있다. 특히 = 표시의 왼쪽에있는 건설. 왜 object_name은 대괄호 안에 있습니까? 내게는 우리가 함수를 호출하는 것처럼 보입니다. 그러나 = 기호의 왼쪽과 오른쪽에 함수를 호출 할 수 있습니까?

+0

@Carl Norum 그러나 'value1 = value2' 구조는 무엇입니까? – Roman

+1

C++ 텍스트 북에서 lvalue 및 참조를 찾습니다. – WhozCraig

답변

5

함수 호출은 왼쪽 값을 반환 할 수 있습니다.이 값은 대입 식의 왼쪽에 나타날 수있는 형식입니다. 이 경우 lvalue의 일반적인 범주는 참조입니다. 예를 들어 vector<T>::front 유형 T &의 참조를 반환 :

std::vector<int> v{0, 1, 2, 3}; 
v.front() = 99; 
// v is now {99, 1, 2, 3} 

고급 사용에만 : 함수가 오버로드 된 할당 연산자와 함께 객체 유형의 prvalue를 반환하는 것이 수도 할당 식을 갖도록 적절한 효과; 그러나 표준 라이브러리는 ostream_iterator과 같은 몇 가지 경우를 제외하고는이를 사용하지 않습니다.

+0

나는 개념을 거의 이해했다. 내가 가지고있는 유일한 문제는 개념 또는 참조입니다. 변수의 "메모리 주소"로 이해합니다. 그러나, 내가 기억하는 한,'a'가 변수의 주소라면'*'를 사용하여 변수의 값을 변경할 수 있습니다. 예를 들면'* a = 5'와 같습니다. 그래서, 왜 우리는이 경우'*'를 사용하지 않을까요? '*'연산자는 객체의 메모리 주소를 캡슐화하고 간접적으로 사용할 수있는 * 포인터 *와 함께 사용됩니다 ('*'단항 연산자 사용). * * (v.front()) = 99;' – Roman

+0

@ 그 객체에 대한 lvalue를 얻는다. 참조는 간접 참조가 필요없이 참조 수명 동안 참조하는 객체의 lvalue로 동작합니다. – ecatmur

0

제 3의 왼쪽은 인수 * object_name *을 사용하여 템플릿 함수를 인스턴스화한다고 생각합니다. func2()의 값을 할당 할 수 있다는 것은 연산자의 오버로드로 인한 것일 수 있습니다. 연산자 =?

0

ccc<ddd>은 아마도 함수 템플릿 (함수 템플릿의 특수화) 일 수 있습니다. 참조를 반환 할 수 있으며이 경우 참조 된 객체가 수정됩니다. 아니면 뭔가 유용한 일을 operator=있는 "프록시"개체를 반환 할 수 있습니다.

덜 가능성 있음, ccc<ddd>은 클래스 유형 (클래스 템플릿의 특수화) 일 수 있습니다. 그러나 유용한 것을 의미하기 위해서는 그 이 임시 ccc<ddd> 객체 이외의 다른 부작용을 가져야합니다. 이는 이상합니다.

1

아마도 반환되는 값은 실제로 값을 할당 할 수있는 l 값입니다. 다음과 같이 될 수 있습니다 :

int x = 5; 

template <typename T> 
int& foo() { return x; } 

void test() 
{ 
    foo<long>() = 10; 
} 
+0

예제에 대한 몇 가지 질문이 있습니다. 왜 템플릿을 사용합니까? 나에게 그것은'foo' 함수 앞에'T'를 "선언"하지만 나중에이 유형을 사용하지 않는 것처럼 보입니다. 그래서, 그것을 선언하는 이유는 무엇입니까?둘째,'foo' 함수는 무엇을 반환합니까? 분명히 x가 아니며, 그렇지 않으면 우리는'5 = 10'을 가질 것입니다. 변수'x'의 주소를 리턴합니까? 만약 그렇다면, 우리는이 주소에있는 값을 변경하기 위해'*'를 사용하지 않을까요? : * foo () = 10;'? – Roman

+0

이유는 제공 한 것과 유사한 예제를 제공하기위한 것입니다. 물론 예제에서 템플릿은 어떻게 든 사용되지만 구현이 없으므로 어떻게 구현할 수 없습니다. 변수의 주소 인 참조를 반환하지만 다른 방법으로 사용하기위한 것입니다. 구현은 현명하지만 포인터이지만 다른 제한 사항이 있습니다. http://en.wikipedia.org/wiki/Reference_(C%2B%2B) – Jack

관련 문제