문제

일부 클래스 C의 경우 :

C* a = new C();

C* b(a);  //what does it do?

C* b = a;  //is there a difference?
도움이 되었습니까?

해결책

C* B (a) 및 C* B = A는 동일합니다. 많은 언어와 마찬가지로, 그것을하는 방법은 여러 가지가 있습니다 ...

다른 팁

이에 주목하십시오

C* a = new C();
C* b(a);  

B는 A와 동일한 값을 할당 한 C 객체에 대한 포인터입니다. 하지만,

#include "somefile.h"
C* b(a);  

우리는 B를 유형 A의 객체를 취하는 함수로 쉽게 정의하고 C로 포인터를 반환 할 수 있습니다.

표준은 다른 종류의 초기화가 8.5이며,이 두 가지는 구체적으로 8.5/12 미만을 설명합니다.

C* b(a);  //what does it do?

이것은 ... 불리운다 직접 초기화. 'b'에 클래스 유형이 있다면 컴파일러는 'a'를 인수로 사용하여 C의 생성자에서 과부하 분해능을 수행합니다. 포인터 유형의 경우 단순히 'a'로 'b'를 초기화합니다.

C* b = a;  //is there a difference?

표준은 어떤 경우에는 이것들이 다르다고 생각합니다. 위의 구문은 초기화를 복사하십시오. 'b'로서 직접 초기화는 클래스 유형이 아니며 'a'의 값으로 초기화됩니다. 'a'와 'b'가 동일한 클래스 유형이라면 직접 초기화 사용.

여기서 'b'는 클래스 유형이고 'a'는 다른 유형 (클래스 여부)을 갖습니다. 규칙은 약간 다릅니다 (8.5/14-b1.b3). 따라서 다음 코드의 경우 :

C b = a;

첫째, ''a '를 입력하도록 변환하려고 시도한 다음이 임시 객체는'b '를 초기화하는 데 사용됩니다. 이것은 상황을 가질 수 있기 때문에 중요합니다. 직접 초기화 성공하지만 성공합니다 초기화를 복사하십시오 실패 :

class A {
public:
  operator int ();
};

class B {
public:
  B (int);
};

void foo ()
{
  A a;
  B b1 (a);  // Succeeds
  B b2 = a;  // Fails
}
  1. c* a = 새로운 c (); 이제 새로운 키워드를 사용하여 새로운 메모리를 할당하는 유형 C의 포인터를 생성하고 있습니다 ....
  2. 다음 진술은 귀하의 의견에 따라 다릅니다 생성자 로직. C* B (a); // 무엇을합니까?
  3. 첫 번째와 세 번째 진술은 동일합니다. c* b = a; // 차이가 있습니까?

첫 번째는 C의 새 인스턴스를 생성하고 주소를 a에 넣습니다.

두 번째는 포인터-기능 선언입니다. 이 포인터는 A 형의 인수를 취하는 모든 함수를 가리키고 유형 C의 객체에 대한 포인터를 반환 할 수 있습니다.

세 번째는 C 형의 객체에 대한 포인터 인 B를 선언하고 a로 초기화합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top