C++의 참조
이 기사에서는 C++에서 참조를 사용하는 방법에 대한 여러 방법을 보여줍니다.
& attr(optional) declarator
표기법을 사용하여 C++에서lvalue
참조 선언
참조는 객체의 대체 이름을 정의합니다. 그것들은 객체 자체가 아니기 때문에 참조 배열이나 참조 포인터를 가질 수 없습니다. 참조는 이미 존재하는 객체만을 참조하며 이러한 객체에 바인딩되어 선언 후에는 수정할 수 없음을 의미합니다.
또한 참조를 초기화해야하며 참조 이름을 사용하여 작업을 수행하면 바인딩 된 개체가 수정됩니다. 후자의 기능은 포인터와 매우 유사합니다. 참조를 포인터에 대한 대안으로 고려할 수 있습니다. 단, 전자는 역 참조 표기없이 일반 변수 이름으로 사용되어 해당 객체의 값에 액세스 할 수 있습니다. 참조의 동작을 모방하려면 주어진 유형에 대한const
포인터를 선언 할 수 있습니다. 후자는 값에 액세스하는 표기법을 제외하고 참조와 동일한 기능을 특징으로합니다.
다음 예제 코드에서xr
변수는int
오브젝트를 나타내는x
에 대한 참조로 선언됩니다. 선언 중에xr
이 초기화되면 모든 유형의 다른 개체를 참조하도록 다시 할당 할 수 없습니다. 반면에xr
와 같은 다른 별칭 이름을 참조하는 동일한 개체에 정의 할 수 있습니다. 즉,xrc
는const
규정 된 참조입니다. 즉, 해당 오브젝트의 값은 액세스 만 가능하며 별명을 사용하여 수정할 수 없습니다.
#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 참조는 큰 개체의 값 비싼 복사본을 피하기 위해 생성자 이동 및 할당 이동과 같은 효율적인 작업을 구현하는 데 사용됩니다.
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