문제

무엇을 더 연습할 때 주는 기능이 원하는 변수로 작업:

unsigned long x = 4;

void func1(unsigned long& val) {
     val = 5;            
}
func1(x);

또:

void func2(unsigned long* val) {
     *val = 5;
}
func2(&x);

IOW:이 있을 선택하는 이유가 다른 하나?

도움이 되었습니까?

해결책

내 엄지손가락의 규칙은:

포인터를 이용하면 당신은 포인터 연산과 그들(예를 들어,증가하는 포인터를 통해 단계열)또는 당신이 이제까지 전달하는 NULL 을-포인터이다.

참조를 사용하지 않습니다.

다른 팁

나는 진짜로 생각하는 당신은 도움이됩니다 설정하는 다음의 함수를 호출하는 코딩 가이드라인:

  1. 으로 다른 모든 장소,항상 const습니다.

    • 참고:이 의미는 다른 것들,그만-값(항목을 참조 3)의 값 값에 의해 전달(see item4)수 있습이 부족 const 지정자.
  2. 만 통과하여 값을 경우 포인터 값을 0/NULL 유효한 입력된 현재 상황에서.

    • 이론적 설명 1:로 , 는 것을 볼 수 당신이 무엇을 전달 에서 사용 가능한 상태입니다.

    • 이론적 설명 2:로 , 에,당신은 알고있는 어떤 제공 에서 사용 가능한 상태입니다.따라서,NULL 체크 또는 오류 처리해야에 대해 수행하는 값입니다.

    • 이론적 설명을 3:이론적 설명 1 2 컴파일러가 강제 적용.항상 오류를 컴파일 시간에 당신은 할 수 있습니다.

  3. 는 경우 함수의 인자는 아웃 가치,그것을 통과하여 참조.

    • 설명:우리는 휴식 하지 않으려는 항목 2...
  4. 선택하"값에 의해 전달"over"에 의해 전달 const"를 참조하는 경우에만 가치 포드(일반전 큰 데이터 구조를 다)또는 충분히 작은(메모리 현명한)또는 다른 방법으로 저렴한 충분(시간-현명한)를 복사합니다.

    • 설명:불필요한 복사본입니다.
    • 참고: 충분히 작저렴한 충분 되지 않은 절대 measurables.

이것은 궁극적으로 종료되는 주관적이다.토론 지금까지의 유용하지만,지가 있다고 생각하지 않은 정정 또는 결정적인 대답이다.많은 것입니다에 따라 달라집타일 가이드라인 및 필요합니다.

그러나 거기에 몇 가지 다른 기능(는지 무언가가 될 수 있습니다 NULL)포인터,가장 큰 실제적인 차이를 위한 출력 매개변수가 순수하게 구문입니다.구글의 C++스타일 가이드(https://google.github.io/styleguide/cppguide.html#Reference_Arguments),예를 들어,의무만 포인터를 위한 출력 매개변수,그리고 수만 참조하는 것은 불가능합니다.추론은 하나의 가독성:뭔가 값으로 구문 없어야 한다는 포인터를 의미.그런 얘기가 아닙니다 이것은 반드시 오른쪽 또는 잘못이지만,나는 생각한 점은 그것이 문제의 스타일이 아닌의 정확성이 있어야 한다.

당신이 통과해야 하는 포인터를 하려고 하는 경우의 값을 수정 변수입니다.하더라도 기술적으로 통과를 참조 또는 포인터가 동일한 전달에서 포인터를 사용 사례는 더 읽을 수 있는 그대로"광고하는"사실에는 값에 의해 변경됩니다.

이 있는 경우 매개 변수해야 할 수 있습을 나타내는 값이 없는 그것의 일반적인 관행을 매개 변수 포인터 값과 NULL 을 전달합니다.

더 나은 솔루션에서 가장 많은 경우(에서는 안전 관점)를 사용하는 것입 부스트::선택.이것은 당신을 통과하는에서 선택적 값을 참조에 의해 또한으로 반환 값.

// Sample method using optional as input parameter
void PrintOptional(const boost::optional<std::string>& optional_str)
{
    if (optional_str)
    {
       cout << *optional_str << std::endl;
    }
    else
    {
       cout << "(no string)" << std::endl;
    }
}

// Sample method using optional as return value
boost::optional<int> ReturnOptional(bool return_nothing)
{
    if (return_nothing)
    {
       return boost::optional<int>();
    }

    return boost::optional<int>(42);
}

사용 참조할 때,당신이 할 수있는 포인터를 사용하여야 할 때다.서 C++자주 묻는 질문:"때 사용해야 하는 참조를 사용해야 하는 경우 포인터?"

포인터

  • 포인터 변수에는 메모리 주소입니다.
  • 포인터 선언로 구성되어 있는 기본 형식*,그리고 변수 이름.
  • 포인터를 지정할 수 있습니수의 변수에서 일생
  • 포인터를 하지 않는 현재 포인트 유효한 메모리 위치에 주어진 값은 null(는 영)

    BaseType* ptrBaseType;
    BaseType objBaseType;
    ptrBaseType = &objBaseType;
    
  • 다&은 단항 연산자를 반환하는 메모리 주소의 피연산자가 있습니다.

  • 참조 operator(*)에 액세스하는 데 사용되는 변수에 저장된 값는 포인터.

       int nVar = 7;
       int* ptrVar = &nVar;
       int nVar2 = *ptrVar;
    

Reference

  • 참조(&)는 별칭에는 기존의 변수입니다.

  • 참조(&)은 다음과 같은 상수 포인터를 자동으로 역 참조하세요.

  • 그것은 일반적으로 사용되는 기능을 인수 목록 및 기능 값을 반환합니다.

  • 참조 초기화해야 합니다면 그것이 만들어집니다.

  • 한 번에 참조로 초기화됩 객체를 변경할 수 없습니다를 참조하는 또 다른 목적으로 한다.

  • 할 수 없습니다 NULL 참조가 있습니다.

  • Const 참조 참조할 수 있습니다 const int.그것은 일시적 변수의 값 const

    int i = 3;    //integer declaration
    int * pi = &i;    //pi points to the integer i
    int& ri = i;    //ri is refers to integer i – creation of reference and initialization
    

enter image description here

enter image description here

에 대한 참조는 암시적 포인터이다.기본적으로 값을 변경할 수 있습에 참조 하지만 당신은 변경할 수 없는 참조를 포인트를 다른 뭔가가 있습니다.그래서 제 2 센트는 경우에 당신만 원하는 값을 변경한 매개변수의 통과으로 그것을 참조하지만 필요하신 경우에는 매개변수를 변경하여 다른 객체를 사용하여 전달 포인터이다.

고려 C#'s 밖으로 키워드를 사용합니다.컴파일러가 필요합자의 방법을 적용 밖으로 키워드를 모두 인수하더라도,그것은 이미 알고 있는 경우.이는 향상을 위해 개설된 프로그램입 가독성을 높입니다.이 있지만 현대 Ide 내가 생각하는 경향이라는 직업에 대한 구문(또는 의미)강조.

에 의해 전달 const 참조지 않는 한 이유가 당신/변경을 유지하는 내용을 전달하고 있습니다.

이것이 가장 효율적인 방법이 대부분의 경우에 있습니다.

를 사용해야 합 const 에 각 매개변수는 당신이 원하지 않을 변경으로,이를 보호할 뿐만 아니라 무언가를 하기에서 당신의 개인정보 취급방침 및 기능,그것은 좋은 표시를 제공하여 다른 사용자가 어떤 기능을 전달된 값입니다.이 포인터 const 경우에만 변경하려는 무엇이고 지적했다.

포인:

  • 할당 nullptr (나 NULL).
  • 에서 호출 사이트를 사용해야 합니다 & 당신의 유형이 아닌 포인터,자신 을 만드는 명시적으로 수정하고 있습니다.
  • 포인터를 수 있는 반등이 있습니다.

참고:

  • Null 이 될 수 없습니다.
  • 일단 바인딩,변경할 수 없습니다.
  • 발신자가 할 필요가 없을 사용하여 명시적으로 &.이것은 고려 때로는 기 때문에 나쁜 당신이 가야하는 기능의 구현을 참조하는 경우 당신의 매개변수를 수정합니다.

Reference 유사한 포인터는 것을 제외하고,당신을 사용할 필요가 없 접두사*대화에 액세스하는 값에 의해 언급합니다.또한,참조될 수 없어 참조 다른 객체를 한 후 그것의 초기 설정입니다.

참조은 특히 유용한 지정을 위한 함수 인자.

자세한 내용은"투어는 C++"의"비얀 이후"(2014)페이지 11-12

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