C++의 복사, 이동, 참조, 오른쪽 가장자리 값 참조를 내 자신으로 모으기

9484 단어 C++구문의미tech
※ 절반을 쓰고, 조금씩 보완, 수정했다.
C++의 데이터 형식은 값의 의미인 것 같습니다.
즉, 変数 = 変数하면 C++에서도 모든 값을 복사할 수 있습니다...이것은 기본 동작입니다. C++의 다양한 종류와 데이터 형식 (st:string, std:vector, std:aray) 의 표준도 마찬가지입니다.이러한 동작이나 처리를 의미라고 하는데, 특히 복제된 동작을 의미라고 한다
○ 복제 의미(값의 의미)
이렇게 말하다.
컴퓨터로 말하면 서류와 폴더의 복사본인가요?
다른 한편, 다른 언어(예를 들어 Python 등)에서는 기본적으로 값 자체가 복제되지 않고 수치의 인용만 복제된다.
이것 괜찮아요?
참조의 의미
이렇게 말하다.
그림에서 파일이나 폴더에 대한 단축키나 기호 링크를 만들 수 있습니다!
파이썬은 의미를 복제할 수 없습니까?그렇지 않습니다. 파이톤의 세계에서도 deepcopy () 라는 함수를 사용할 수 있습니다.
C++도 int& a = b;처럼 빵 샌드위치와 같은 특수한 문법으로 참조할 수 있다.
C++에서 복제어의와 참고어의를 제외하고는
○ 무브세만티크스
네.
이미지에서 파일 및 폴더의 잘라내기 - 붙여넣기(이동)[1]
C++면 std::string a = std::move(b);라고 쓰면 돼요.
그러나vector와string이 내부 필드에 저장된 바늘의 참조 대상의 값을 하나하나 메모리로 이동하면 비용이 들겠죠?
따라서 실제 각종 참고 값만 이동하는 지침이 있다.
어려워...[2]
C++ 기타
○ 지침
아종... 로 삼다
○ 오른쪽 값 참조
참조○ const
잠깐만요.
(지침을 참고의 의미에 포함시켜야 하는지의 여부는 미묘한 부분인데...이 글은 깊이 연구하지 않았습니다. 영어에서는 지침 전달이든 참고 전달이든reference죠...)
이렇게 하면 C++는 여러 가지 의미를 구분해서 상세하게 설명할 수 있다.
그러나 구별해서 사용하는 부분은 C++의 장점이고 다른 한편으로는 어려워서 어떻게 써야 어떤 의미(동작)가 될지 모르겠어요!이런 사람들 많을 텐데.내가그 동작의 일람표를 만드는 것이 이 보도의 취지다.
예를 들면, 아래의 상황은 어떻게 될까요...?
C++
int b = 10;
int&& a = b; //無理 右辺値参照は右辺値しか受け取れない
이 경우 a는 오른쪽 값 참조형이기 때문에 오른쪽 값만 받아들일 수 있습니다.
잘못했어.
일람표 왼쪽은 참조 오른쪽, 오른쪽은 일반 행에서 오류가 발생했습니다.

본 글의 용어를 확인하다


보도의 편의를 위해 특별한 용어는 아니지만 일단 확인해 보겠습니다.= 왼쪽 수신측의 변수 → 왼쪽 = 오른쪽 전달측의 변수 또는 값 → 오른쪽
그렇습니다.
C++에서 = 을 사용하지 않고 {} 또는 ()에서 초기화할 수도 있지만 기본 규칙은 같습니다.
받아들이는 쪽은 왼쪽으로, 전달하는 쪽은 오른쪽으로 (inta{b}이면 a는 왼쪽, b는 오른쪽)
이 보도는 알기 쉬운 것을 우선으로 한다.
함수 매개 변수도 대체로 같다.
void f(int a);
f(b); // bはどこかで定義されている。
함수 f의 임시 매개 변수인inta는 수신측에 있기 때문에 왼쪽
실제 매개 변수인 b는 한쪽에 맡기기 때문에 오른쪽입니다.
네.
그 밖에 본문 중 혹은 본 보도 중의 표는 대체로 이렇다
일반 변수(또는 일반)→int a;참조 변수(또는 참조)→int& a;오른쪽 참조 →int&& a;참조const→const int& a;라는 뜻이다.

일반 변수와 오른쪽 가장자리 값의 인용이 다르다


일반적인 변수와 참조 오른쪽 값은 모두 오른쪽 값을 얻을 수 있는데 어떤 차이가 있습니까?
(이것은 내가 처음으로 오른쪽 값을 참고할 때의 의문이다)
아래의 (A) 와 (B) 왼쪽의 유형은 다르다.
C++
//aは普通の変数
int b = 10;
int a = std::move(b);  // ・・・(A)

//yは右辺値参照
int x = 10;
int&& y = std::move(x);// ・・・(B)

//↑は両方ともエラーにならない。
일반 변수(A)도 오른쪽 값으로 초기화할 수 있다(잡담이지만 속박이라고 한다)
오른쪽 값 참조(B)도 틀리지 않습니다.
(A)랑 (B)랑 뭐가 달라요?
(A) 무브입니다.
(B) 변동이 일어나지 않았다.
나도 오해했지만 왼쪽이 오른쪽을 참조하면 파동이 일어나지 않는다.
결국 나는 오른쪽 값의 참조로 해석해야 하며 이동 값이 없다고 생각한다.
둘 다int형으로 사용자 정의형이라면(A)을 모바일 구조기라고 부른다.
다른 한편, (B)는 이동구조기라고 부르지 않는다.
이것은 초기화할 뿐만 아니라 대입도 마찬가지다.
C++
//aは普通の変数
int b = 10;
int a;
a = std::move(b); //ムーブ代入が起きる

//右辺値参照はそもそも再代入できない。
//int x = 10;
//int&& y;   //エラー 右辺値参照(普通の左辺値参照も)は定義時に右辺値で初期化する必要がある
//y = std::move(x);
초기화할 때 일단 정의된 물건이 대입(재대입)될 때 각종 구조기(보통·복제·이동)가 아니라 각종 대입 산자(복제·이동)이다.
오른쪽 가장자리 값 참조나 참조는 다시 입력할 수 없습니다(왼쪽 가장자리 값 참조).

동작 일람표


왼쪽
오른쪽
액션
초기화할 때 호출되는 구조기 (대입할 때 호출되는 연산자)
시험을 준비하다
일반적
일반적
복제하다
복제 구조기(복제 대입 연산자)
일반적
오른쪽 경계 값
이동
이동구조기(이동대입산자)
일반적
인용하다
복제하다
복제 구조기(복제 대입 연산자)
일반적
오른쪽 값 참조
복제하다
복제 구조기(복제 대입 연산자)
인용하다
일반적
참조
아무 것도 불러낼 수 없다
참조를 대입할 수 없음(이하 참조할 수 없음)
인용하다
오른쪽 경계 값
잘못

인용하다
인용하다
참조(대입 시 복사)
호출되지 않음(대입 연산자 복사)
인용 변수를 초기화할 때만 인용합니다.대입할 때 일반적인 변수도 똑같이 복제된다.번거롭다
인용하다
오른쪽 값 참조
잘못

참조 const
일반적
참조
아무 것도 불러낼 수 없다
다시 대입할 수 없음(이하 const 참조할 수 없음)
참조 const
오른쪽 경계 값
[3] 오른쪽 값을 참조합니까?참조
아무 것도 불러낼 수 없다
오른쪽 가장자리 값(임시 대상)의 수명 연장const 참조 변수의 길이
참조 const
인용하다
참조
아무 것도 불러낼 수 없다
오른쪽 값 참조
일반적
잘못

다시 대입할 수 없음(이하 오른쪽 값은 참조할 수 없음)
오른쪽 값 참조
오른쪽 경계 값
오른쪽 값 참조
아무 것도 불러낼 수 없다
오른쪽 가장자리 값(임시 대상)의 수명 연장 오른쪽 가장자리 값 참조 변수의 수명
오른쪽 값 참조
인용하다
잘못

오른쪽 값 참조
오른쪽 값 참조
잘못

함수의 반환값도 특수하다...


기본적으로 상술한 변수의 초기화, 대입(함수 매개 변수도 같다)의 규칙과 같다...
※ 반을 썼습니다.예정된 필기만 놓다.
int func(int& v) {
    return v; //return時に関数内でもコピー、ムーブ、参照、右辺値参照の概念がある。
}

int receive = func(val);  //ここで何が起こってるのか...? →コピーコンストラクタは一回


int&& a = func(val); //これはどうなるか?→可能(つまり関数の戻り値は右辺値扱い※1)

int a = func(); //関数の戻り値は右辺値のはず。法則からしてムーブコンストラクタが呼ばれるはず...→実はムーブコンストラクタは呼び出されない。これは特殊なのか


//C++の場合、最適化やRVOやNRVOなどがあってまたややこしい。
//※1ただし、参照を返す関数の場合はprvalueにはならない...うーんうーん。。
각주
무브의 설명은 시종 그림이 우선이다.↩︎
Rust 이동이 기본 동작입니다.unique_ptr처럼 소유권의 파동 동작이 됐죠.↩︎
나는 참고로 써야 한다고 생각하지만,const 참조와 참조가 다르면 오른쪽의 수치도 참조할 수 있다...길을 잃었습니다.↩︎

좋은 웹페이지 즐겨찾기