2014-11-10 4 views
0

저는 Java와 C#에 익숙하며 C++로 내 지평을 넓히고 싶습니다.C++ 액세스 멤버 및 함수

그러나 개체 또는 개체의 메서드에 액세스 할 때 -> 또는 . 연산자를 사용하는 경우를 이해하는 데 어려움이 있습니다.

저는이 질문을하는 첫 번째 사람이 아니라고 확신합니다. 거기에 같은 문제를 해결하기 위해 많은 질문이 있지만, 난 단지 내 특별한 경우에 제공된 답변을 연결할 수 없습니다.

내가

Stock라고하는 매우 간단한 클래스가 :

class Stock 
{ 
public: 
    int32_t value; 
    string name; 

    Stock(void); 
    ~Stock(void); 

    void doStuff(); 
}; 

내가 객체가 힙에 할당하면 나는 그것이 스택 공간에있는 경우 ->.을 사용한다는 것을 알고있다. 나는 Stock 객체의 이름 문자열의 길이를 인쇄하기를 원한다면

그러나 나는 같은 것을 할 필요가있을 것이다 :

Stock* bmw = new Stock; 
bmw->name = "BMw"; 
cout << bmw->name.length() << endl; 

주식의 이름을 통해 액세스 할 수 있습니다 "->"연산자 , "."을 통한 이름의 길이 운영자. 내 견해로는이 두 객체 (주식과 문자열)가 힙 공간에 있기 때문에 -> 연산자 만 필요할 것입니다.

무엇이 여기에 있습니까? 문자열과는 어떤 관계입니까? 나는 thougt 문자열은 항상 포인터입니다 ... 조금만 움직이고있는 개념을 설명해 주시겠습니까?

답장을 미리 보내 주셔서 감사합니다. 당신이 포인터, .를 사용하는이 때 당신이 예를이있을 때

마르쿠스

+1

시작 [여기] (https://stackoverflow.com/q/388242/241631). C++을 배우는 가장 좋은 방법은 좋은 책을 읽기 시작하는 것입니다. – Praetorian

+0

'bmw'를 포인터로 만들지 않았다면'.' 연산자로 멤버에 접근 할 수 있습니다. '-> '연산자는 멤버를 역 참조하고 접근한다. –

답변

3

-> 사용됩니다.

예에서 bmwStock 인스턴스에 대한 포인터이므로 -> 연산자를 사용하여 멤버를 참조합니다. name 필드는 인 문자열이므로 . 연산자를 사용합니다. 에서 가져 와서 자신을 혼동하지 마십시오 -

또한

(*bmw).name = "BMw"; 

*bmw 이후 수익률 그의 주소 varialbe 그것은 그만큼 간단 bmw

에 저장되어있는 예를로 쓸 수 스택과 힙. 이것들은 단지 메모리 할당 구현 세부 사항입니다.

+1

"이 사용됩니다 ** 인스턴스 ** 또는 참조 **" –

0
bmw->name.length() 

bmw는 힙에 만들어진 Stock 오브젝트에 대한 포인터입니다. 그렇다면 사용해야하는 멤버 (예 : 귀하의 케이스 이름)에 액세스하십시오. "bmw-> name"뒤에 문자열 객체가 생깁니다. 그리고 그 문자열 객체는 힙이 아니라는 새로운 의미로 할당되지 않습니다. 따라서 멤버 (예 : length())에 액세스하려면 '.'을 사용해야합니다. .

0

"사용"-> "힙에 할당 된 개체"는 정확하지 않습니다. 포인터를 통해 객체의 멤버에 액세스하기 만하면 "->"를 사용해야합니다. 다른 상황에서는 "."을 사용하십시오.

1

u가 객체를 가리킬 때 화살표 연산자 (->)를 사용한다는 것을 알고 있습니다. 귀하의 경우 의 경우 name 멤버는 std :: string에 대한 포인터가 아니므로 화살표 연산자를 사용할 수 없으므로 대신 점 (.)을 사용하십시오.

은 당신이 뭔가를 할 수 있습니다 :

std::string* name; 
Stock* sptr = new Stock; 
sptr->name = new std::string("blah blah blah"); 
std::cout << sptr->name->length << std::endl; 
+0

'sptr-> name'과 로컬 변수'name'은 두 가지 다른 것들입니다. 독자를 혼동하지 마십시오. – Ajay

0

오신 것을 환영합니다 원래 세계로, C++에 의해 지배! C++에서

, 당신은 왼쪽에 표현식이 class, struct 또는 union의 포인터로 평가할 때 .를 사용, 그렇지 않으면 만 ->를 사용해야합니다. 함수는 객체에 대한 포인터를 반환 할 수 있습니다, 그리고 거기 당신은 -> 연산자를 사용해야합니다

Stock* GetStockByIndex(int); 
GetStockByIndex(0)->value; 

->의 사용이 new/힙에 구속되지 않으며, .의 사용은 할당 된 객체를 스택에 바인딩되지 않습니다. 문맥 일뿐입니다 (왼쪽에이라는 표현이 있습니다).

가까운 장래에, 당신은 또한이 표시됩니다 수 있음을

Stock s; 
s->calculate(); 

방법, 당신이 궁금해 할 수있다. C++이 ->에 과부하가 걸리기 때문입니다!

환영합니다!