2017-11-10 4 views

답변

5

예. Java와 비교하여 스택이나 힙에 만들지 여부를 결정해야합니다. 전자는 int와 같은 동작을하지만 (int와 같은 동작, 다형성없는 동작), 후자는 참조 의미 (동일한 객체 인스턴스를 참조하고, 다형성으로 동작 할 수 있고, 복제로 복사)를 가질 수있는 값 의미론을 가질 수 있습니다.

void ref(const X& x)  { x.do(); } // Reference semantics 
void ptr(const X* const x) { x->do();} // Reference semantics 
void val(const X x)  { x.do(); } // Value semantics 

int main() 
{ 
    ref(X{});  // Created on the stack 
    ptr(new X{}); // Created on the heap, but leaks! 
    val(X{});  // Created on the stack, moved rather than copied if available 

    auto x = X{}; // Created on the stack 
    ref(x); 
    ptr(&x); 
    val(x); // Makes a copy of the object 

    auto p = std::make_unique<X>(); // Created on the heap, doesn't leak 
    ref(*p); 
    ptr(p.get()); 
    val(*p); // Makes a copy of the object 
} 

* 일부 농구대를 뛰어 넘으면 값 의미와 함께 다형성 동작을 가질 수 있습니다. 예를 들어 루이 디온 (Louis Dionne)의 CppCon17에서의 이야기 (Runtime Polymorphism)를 참조하십시오. 이 농구를 뛰어 넘지 않고 값 객체를 다형 적으로 사용하려고하면 객체 조각으로 끝날 수 있습니다.

5

네, 그런 일을 할 수 있습니다. 이것은 임시 변수이므로 Java에서와 마찬가지로 이름을 지정할 필요가 없습니다.

구문은 다음과 같습니다 클래스를 매개 변수가 필요한 경우

function(Parameter()); 

단지 임시 변수 생성자에 전달 :

function(std::string("hello")); 

그리고 마지막으로, 당신은 자바 쓴 C에서 작동합니다 ++ 뿐만 아니라 :

function(new Parameter()); 

그러나 이것은 힙에 Parameter 객체를 할당하고 void 메모리 누수가 있으면 함수 내에서 삭제해야합니다. 그러나 이것은 대개 나쁜 생각입니다.