C++의 참조

Jinku Hu 2023년10월12일
  1. & attr(optional) declarator표기법을 사용하여 C++에서lvalue참조 선언
  2. 참조를 사용하여 C++에서 함수 프로토 타입 구현
C++의 참조

이 기사에서는 C++에서 참조를 사용하는 방법에 대한 여러 방법을 보여줍니다.

& attr(optional) declarator표기법을 사용하여 C++에서lvalue참조 선언

참조는 객체의 대체 이름을 정의합니다. 그것들은 객체 자체가 아니기 때문에 참조 배열이나 참조 포인터를 가질 수 없습니다. 참조는 이미 존재하는 객체만을 참조하며 이러한 객체에 바인딩되어 선언 후에는 수정할 수 없음을 의미합니다.

또한 참조를 초기화해야하며 참조 이름을 사용하여 작업을 수행하면 바인딩 된 개체가 수정됩니다. 후자의 기능은 포인터와 매우 유사합니다. 참조를 포인터에 대한 대안으로 고려할 수 있습니다. 단, 전자는 역 참조 표기없이 일반 변수 이름으로 사용되어 해당 객체의 값에 액세스 할 수 있습니다. 참조의 동작을 모방하려면 주어진 유형에 대한const포인터를 선언 할 수 있습니다. 후자는 값에 액세스하는 표기법을 제외하고 참조와 동일한 기능을 특징으로합니다.

다음 예제 코드에서xr변수는int오브젝트를 나타내는x에 대한 참조로 선언됩니다. 선언 중에xr이 초기화되면 모든 유형의 다른 개체를 참조하도록 다시 할당 할 수 없습니다. 반면에xr와 같은 다른 별칭 이름을 참조하는 동일한 개체에 정의 할 수 있습니다. 즉,xrcconst규정 된 참조입니다. 즉, 해당 오브젝트의 값은 액세스 만 가능하며 별명을 사용하여 수정할 수 없습니다.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int x = 5;
  int& xr = x;
  const int& xrc = x;

  xr *= xr;
  //    xrc *= x; Error
  cout << "xr: " << xr << endl;
  cout << "xrc: " << xrc << endl;

  return EXIT_SUCCESS;
}

출력:

xr: 25
xrc: 25

다음 코드 스 니펫에 설명 된 것처럼 동일한 객체에 대한 여러 참조를 선언 할 수 있습니다. 그럼에도 불구하고 별칭을 수정하면 동일한 객체에 영향을 미친다는 사실을 알고 있어야합니다.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int x = 5;
  int& xr = x;
  int& xrr = x;

  xr *= xr;
  xrr *= xrr;
  cout << "xr: " << xr << endl;
  cout << "xrr: " << xrr << endl;

  return EXIT_SUCCESS;
}

출력:

xr: 625
xrr: 625

참조를 사용하여 C++에서 함수 프로토 타입 구현

참조는 주로 더 깨끗한 함수 인터페이스를 제공하는 데 사용되지만 C++ 언어가 연산자 오버로딩 기능을 제공하고 모든 연산자에 대해 표기법이 동일해야하기 때문입니다. 후자는 언어에 참조 개념이 없다면 복잡 할 것입니다. 따라서 인수를 포인터로 취해야하는 연산자를 사용하면++&x처럼 보일 수 있습니다.

값에 액세스하기 위해 객체를 가져와야하는 함수는 해당 인수를const참조로 지정할 수 있으며const없이 수정이 필요한 경우에도 지정할 수 있습니다. 예를 들어,printVector함수는std::vector에 대한const참조를 사용하여 요소를cout스트림에 인쇄하지만swapElements는 각 요소를 교체해야하므로 다음에 대한 정규 참조가 필요합니다.

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;

template <typename T>
void printVector(const vector<T> &vec) {
  for (auto &i : vec) {
    cout << i << "; ";
  }
  cout << endl;
}

template <typename T>
void swapElements(vector<T> &vec) {
  for (auto iter = vec.begin(); iter < vec.end() - 1; ++iter) {
    std::swap(*iter, *(iter + 1));
  }
}

int main() {
  vector<int> vec1 = {43, 5, 123, 94, 359, -23, 2, -1};

  printVector(vec1);
  swapElements(vec1);
  printVector(vec1);

  return EXIT_SUCCESS;
}

출력:

43; 5; 123; 94; 359; -23; 2; -1;
5; 123; 94; 359; -23; 2; -1; 43

const참조를 포함하여 이전의 모든 참조 예를 lvalue 참조라고합니다. 이러한 참조는 액세스하거나 수정 한 후 유효한 값을 유지해야하는 개체를 참조하는 데 사용됩니다. C++ 언어는 또한 임시 개체를 참조하는 데 사용되는 rvalue 참조를 제공합니다.

임시 객체는 주어진 객체가 다시 사용되지 않을 것이라는 프로그래머의 가정입니다. rvalue 참조는&& attr(optional) declarator표기법을 사용하여 지정되며 객체는 lvalue 참조처럼 액세스됩니다. Rvalue 참조는 큰 개체의 값 비싼 복사본을 피하기 위해 생성자 이동 및 할당 이동과 같은 효율적인 작업을 구현하는 데 사용됩니다.

작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Reference