C++ 클래스
C++ classesC++의 클래스는 키워드로 선언된 사용자 정의 유형 또는 데이터 구조다. class
접근 권한이 비공개, 보호 또는 공개의 세 가지 접근 지정자에 의해 관리되는 그것의 구성원으로서 데이터와 기능(회원 변수 및 회원 기능이라고도 함)을 가지고 있다.기본적으로 C++ 클래스의 멤버에 대한 액세스는 비공개다.개인 회원은 교실 밖에서 접근할 수 없으며, 수업 방법을 통해서만 접근할 수 있다.공개 회원은 학급에 대한 인터페이스를 형성하고 교실 밖에서 접근할 수 있다.
클래스 데이터 유형의 인스턴스는 개체로 알려져 있으며 프로그래머가 정의한 멤버 변수, 상수, 멤버 함수 및 과부하 연산자를 포함할 수 있다.
C++의 구조와 클래스 간의 차이
C++에서 정의한 클래스:class
키워드는 기본적으로 개인 구성원과 기본 클래스를 가지고 있다.구조는 다음과 같이 정의되는 분류다.struct
키워드[1]회원과 기본 클래스는 기본적으로 공개되어 있다.실제로 구조체는 일반적으로 기능이 없는 데이터를 위해 예약된다.클래스/구조물에서 구조물을 도출하는 경우, 기본 클래스/구조물에 대한 기본 액세스 지정자가 공개된다.그리고 클래스를 도출할 때 기본 액세스 지정자는 비공개다.
집계 클래스
Aggregate 클래스는 사용자가 선언하는 생성자가 없는 클래스, 비공개 또는 보호된 비정적 데이터 멤버, 기본 클래스 및 가상 기능이 없는 클래스다.[2]이러한 클래스는 가새로 닫힌 쉼표로 구분된 이니셜라이저 클라스의 목록으로 초기화할 수 있다.[3]다음 코드는 C와 C++에서 모두 같은 의미를 갖는다.
구조상의 C { 인트로 a; 곱절로 하다 b; }; 구조상의 D { 인트로 a; 곱절로 하다 b; C c; }; // 이니셜라이저 목록을 사용하여 C 유형의 개체를 초기화하십시오. C c = {1, 2.0}; // D에는 C형식의 하위집합이 있다.이러한 경우 이니셜라이저-클라인은 내포될 수 있다. D d = {10, 20.0, {1, 2.0}};
POD-구조물
POD-struct (Plain Old Data Structure)는 비POD-struct, 비POD-union(또는 그러한 유형의 배열) 유형의 정전기적 데이터 멤버가 없으며, 사용자 정의 할당 연산자와 사용자 정의 소멸자가 없는 Aggregate 클래스다.[1]POD-구조물은 C++와 동등한 C라고 말할 수 있다.struct
대부분의 경우, POD 구조물은 C에서 선언된 해당 구조체와 동일한 메모리 레이아웃을 가질 것이다.[4]이 때문에 POD 구조물은 구어체로 "C형 구조체"라고 부르기도 한다.[5]
- 데이터 구성원은 접근 지정자에 의해 분리된 경우를 제외하고, 이후 구성원이 객체 내에서 더 높은 주소를 갖도록 할당된다.[6]
- 두 POD 구조 유형은 동일한 수의 비정적 데이터 멤버를 가진 경우 레이아웃 호환성이 있으며, 해당 비정적 데이터 멤버(순서)는 레이아웃 호환성이 있다.[7]
- POD 구조물은 이름 없는 패딩을 포함할 수 있다.[8]
- 재해석된 캐스트를 사용하여 적절하게 변환된 POD 구조 객체에 대한 포인터는 초기 구성원을 가리키며, 그 반대의 경우도 POD 구조 시작 부분에 패딩이 없음을 암시한다.[8]
- POD 구조물은 매크로의 오프셋과 함께 사용할 수 있다.[9]
신고 및 사용
C++ 클래스에는 자체 멤버가 있다.이러한 구성원은 방법, 생성자 및 소멸자로 알려진 변수(다른 구조와 계급을 포함), 함수(특정 식별자 또는 과부하 연산자)를 포함한다.회원은 다음을 사용하여 공개 또는 비공개로 접속할 것을 선언한다.public:
그리고private:
각각 접속 지정자.지정자 다음에 마주친 모든 구성원은 다른 지정자가 마주칠 때까지 관련 접근 권한을 갖는다.또한 계층간에도 상속이 있어 이를 활용할 수 있다.protected:
지정자
글로벌 및 로컬 클래스
모든 방법 밖에 정의된 클래스는 프로그램의 어디에서나 객체가 생성될 수 있기 때문에 글로벌 클래스다.기능 본체 내에서 정의되는 경우, 해당 등급의 개체가 기능 범위에 로컬이기 때문에 로컬 등급이다.
기본 선언 및 멤버 변수
클래스는 다음과 함께 선언된다.class
또는struct
키워드회원들의 선언은 이 선언문 안에 있다.
구조상의 사람 { 끈을 매다 이름을 붙이다; 인트로 나이를 먹다; }; | 계급 사람 { 공중의: 끈을 매다 이름을 붙이다; 인트로 나이를 먹다; }; |
위의 정의들은 기능적으로 동등하다.두 코드 중 하나가 개체 유형을 정의함Person
두 명의 공공 데이터 구성원을 가지고 있다.name
그리고age
. 닫힌 교정기 뒤의 세미콜론은 필수 사항.
이러한 선언 중 하나(두 선언 모두 아님),Person
의 새로 정의된 변수를 생성하기 위해 다음과 같이 사용할 수 있다.Person
데이터 유형:
#include <아이오스트림> #include <끈> 구조상의 사람 { 찌꺼기::끈을 매다 이름을 붙이다; 인트로 나이를 먹다; }; 인트로 본래의() { 사람 a; 사람 b; a.이름을 붙이다 = "칼빈"; b.이름을 붙이다 = "홉스"; a.나이를 먹다 = 30; b.나이를 먹다 = 20; 찌꺼기::뻐드렁니가 나다 << a.이름을 붙이다 << ": " << a.나이를 먹다 << 찌꺼기::끝을 맺다; 찌꺼기::뻐드렁니가 나다 << b.이름을 붙이다 << ": " << b.나이를 먹다 << 찌꺼기::끝을 맺다; }
위 코드를 실행하면 출력됨
캘빈: 30 홉: 20
회원 함수
C++ 클래스 및 구조의 중요한 특징은 회원 기능이다.각 데이터 유형은 데이터 유형의 모든 (공용 및 개인) 멤버에 액세스할 수 있는 고유한 내장 기능(메서드라고 함)을 가질 수 있다.이러한 비정적 멤버 함수의 본문에서는 키워드를 사용하여 함수가 호출되는 객체를 나타낼 수 있다.이것은 일반적으로 함수에 암시적인 첫 번째 인수로 객체의 주소를 전달함으로써 구현된다.[10]위 내용 보기Person
예를 다시 입력하십시오.
#include <아이오스트림> 계급 사람 { 공중의: 공허하게 하다 인쇄하다() 경시하다; 사유의: 찌꺼기::끈을 매다 이름_; 인트로 나이_ = 5; }; 공허하게 하다 사용자::인쇄하다() 경시하다 { 찌꺼기::뻐드렁니가 나다 << 이름_ << ':' << 나이_ << '\n'; // "name_"과 "age_"는 멤버 변수다.'이것' 키워드는 // 값이 멤버가 속한 개체의 주소인 식 // 호출됨.기능이 선언되기 때문에 그 유형은 "Const Person*"이다. // 항상. }
위의 예에서Print
함수는 클래스의 본문에 선언되며, 클래스 이름에 따라 분류하여 정의된다.::
. 둘 다name_
그리고age_
비공개(클래스의 기본값) 및Print
교실 밖에서 사용하려면 공개로 선언되어야 한다.
멤버 기능 포함Print
, 인쇄를 다음과 같이 단순화할 수 있다.
a.인쇄하다(); b.인쇄하다();
어디에a
그리고b
위는 송신자라 불리며, 각각은 송신자일 때 자신의 멤버 변수를 참조할 것이다.Print()
기능이 실행된다.
계급 또는 구조 선언(그 인터페이스라고 함)과 정의(그 구현이라고 함)를 별개의 단위로 분리하는 것이 일반적이다.사용자가 필요로 하는 인터페이스는 헤더에 보관하고 구현은 소스나 컴파일 형태로 따로 보관한다.
상속
메모리에 있는 비 POD 클래스의 레이아웃은 C++ 표준으로 지정되지 않는다.예를 들어 많은 인기 있는 C++ 컴파일러가 부모 클래스 필드를 자식 클래스 필드와 결합하여 단일 상속을 구현하지만, 표준에서는 이것이 요구되지 않는다.이러한 레이아웃 선택은 부모 클래스 유형에 대한 포인터를 통해 파생 클래스를 참조하는 작업을 사소한 작업으로 만든다.
예를 들어 다음을 고려하십시오.
구조상의 P { 인트로 x; };
구조상의 C : P { 인트로 y; };
의 예P
A과 함께P* p
그것을 가리키는 것은 기억에서 다음과 같이 보일 수 있다.
+----+ P::x +----+ ↑ p
의 예C
A과 함께P* p
이를 가리키는 것은 다음과 같이 보일 수 있다.
+----+----+ P::x C::y +----+----+ ↑ p
그러므로 a의 장을 조작하는 모든 코드는P
물체가 조작할 수 있다.P
안쪽에 있는 들판C
의 정의에 대해 아무 것도 고려하지 않고 반대하다C
의 분야적절하게 작성된 C++ 프로그램은 어떤 경우에도 상속된 필드의 레이아웃에 대해 어떠한 가정도 해서는 안 된다.static_cast 또는 dynamic_cast 유형 변환 연산자를 사용하면 포인터가 한 유형에서 다른 유형으로 적절하게 변환되는지 확인할 수 있다.
다중 상속은 그렇게 간단하지 않다.만약 수업이라면D
상속하다P
그리고C
, 그러면 양친의 필드는 어떤 순서로 저장되어야 하지만, (대략) 부모계급 중 오직 하나의 부모계급만이 파생계급의 전면에 위치할 수 있다.컴파일러에서 포인터를 변환해야 할 때마다D
어느 쪽이든 타이프로 치다P
또는C
컴파일러는 파생 클래스의 주소에서 기본 클래스 필드의 주소로 자동 변환을 제공한다(이것은 간단한 오프셋 계산이다).
다중 상속에 대한 자세한 내용은 가상 상속을 참조하십시오.
과부하 연산자
C++에서 연산자(예:+ - * /
는 프로그래머들의 필요에 맞게 과부하될 수 있다.이러한 연산자를 과부하 연산자라고 한다.
관례에 따라 과부하 연산자는 내장 데이터 유형(datypes 기본 제공)행동해야 한다 동일하게에서와 거의.int
,float
, 등), 그러나 이것은 필수가 아니다.라고 하는 구조를 선언할 수 있다.Integer
변수가 실제로 정수를 저장하지만 호출하여Integer * Integer
제품 대신 정수의 합계를 반환할 수 있다.
구조상의 정수 { 정수() = 체납; 정수(인트로 j) : i{j} {} 정수 운영자*(경시하다 정수& k) 경시하다 { 돌아오다 정수(i + k.i); } 인트로 i = 0; };
위의 코드는 반환 값을 "구축"하기 위해 생성자를 사용했다.보다 명확한 발표를 위해(컴파일러가 위와 같은 문장으로 문구를 최적화할 수 없는 경우 프로그램의 효율을 떨어뜨릴 수 있지만), 위의 코드를 다음과 같이 다시 작성할 수 있다.
정수 운영자*(경시하다 정수& k) 경시하다 { 정수 m; m.i = i + k.i; 돌아오다 m; }
프로그래머들은 또한 운영자의 프로토타입력할 수 있다.struct
글로벌 범위에서 운영자의 기능을 선언하고 정의한다.
구조상의 정수 { 정수() = 체납; 정수(인트로 j) : i{j} {} 정수 운영자*(경시하다 정수& k) 경시하다; 인트로 i = 0; }; 정수 정수::운영자*(경시하다 정수& k) 경시하다 { 돌아오다 정수(i * k.i); }
i
위는 송신자 자신의 멤버 변수를 나타내는 반면,k.i
인수 변수에서 멤버 변수를 나타냄k
.
그const
키워드는 위의 코드에 두 번 나타난다.첫 번째 발생, 논쟁const integer& k
는 함수에 의해 인수 변수가 변경되지 않을 것임을 나타냈다.선언 종료 시 두 번째 발생은 컴파일러가 함수 실행으로 송신자가 변경되지 않을 것임을 약속한다.
인const integer& k
, 앰퍼샌드 (&)는 "기준에 의해 통과"를 의미한다.함수를 호출하면 변수의 값이 아니라 변수에 대한 포인터가 함수에 전달된다.
위의 과부하 특성은 클래스에도 동일하게 적용된다.
사업자의 아리티, 연상성, 우선순위는 변경할 수 없다는 점에 유의한다.
이진 과부하 연산자
이진 연산자(두 개의 인수가 있는 연산자)는 하나의 인수를 호출하는 "식별자" 연산자(thomething)로 함수를 선언함으로써 과부하된다.연산자 왼쪽의 변수는 송신자, 오른쪽의 변수는 인수인 것이다.
정수 i = 1; /* 다음과 같이 구조 변수를 초기화할 수 있다. 첫 번째 시공사만 부른다면. 특정 논거*/ 정수 j = 3; /* 변수 이름은 다음 이름과 독립적이다. 구조물의 구성원 변수*/ 정수 k = i * j; 찌꺼기::뻐드렁니가 나다 << k.i << '\n';
'3'은 인쇄될 것이다.
다음은 과부하 가능한 이항 연산자 목록이다.
연산자 | 일반용도 |
---|---|
+ - * / % | 산술 계산 |
^ & ! << >> | 비트 와이즈 계산 |
< > == != <= >= | 논리비교 |
&& | 논리 접속사 |
!! | 논리분리 |
= <<= >>= | 복합 할당 |
, | (일반적인 사용 없음) |
구조 유형이 같은 두 변수 사이의 '='(할당) 연산자는 변수들의 전체 내용을 한 변수에서 다른 변수로 복사하기 위해 기본적으로 과부하된다.필요한 경우 다른 것으로 덮어쓸 수 있다.
연산자는 한 사람 한 사람씩 과부하해야 하고, 다시 말하면 과부하가 서로 연관되어 있지 않다는 것이다.예를 들어,<
반드시 의 반대인 것은 아니다.>
.
단일 과부하 연산자
위에서 명시한 대로, 어떤 연산자는 왼쪽의 송신자와 오른쪽의 인수라는 두 가지 용어를 사용하지만, 어떤 연산자는 송신자, 즉 하나의 주장만 가지고 있으며, 그들은 "단일"이라고 한다.그 예로는 부정적인 기호(그 왼쪽에는 아무것도 붙이지 않을 때)와 "논리적 NOT"(배제 마크)가 있다)가 있다.!
).
단항 연산자의 송신자는 연산자의 왼쪽 또는 오른쪽에 있을 수 있다.다음은 단일 과부하 연산자의 목록이다.
연산자 | 일반용도 | 발송인 위치 |
---|---|---|
+ - | 양수/음수 부호 | 맞다 |
* & | 데레시 | 맞다 |
! ~ | 논리적/비트와이즈 NOT | 맞다 |
++ -- | 사전 증가/감소 | 맞다 |
++ -- | 증감후/감소 | 남겨진 |
송신자가 오른쪽에 있는 단항 연산자의 과부하 구문은 다음과 같다.
return_type operator@ ()
발신인이 왼쪽에 있을 때 선언문은 다음과 같다.
return_type operator@ (int)
@
위는 작업자가 과부하되는 것을 의미한다.대체하다return_type
반환 값의 데이터 유형(int
,bool
, 구조물 등)
그int
매개변수는 본질적으로 송신자가 운영자의 왼쪽에 있음을 나타내는 관례에 지나지 않는다.
const
해당되는 경우, 선언의 끝에 논거를 추가할 수 있다.
과부하 브래킷
![]() | 이 절의 사실적 정확성은 논쟁의 여지가 있다.(2009년 1월) (이 를 과 시기 |
대괄호[]
그리고 원형 브라켓()
C++ 구조로 과부하될 수 있다.대괄호는 정확히 하나의 인수를 포함해야 하며, 대괄호는 특정한 수의 인수를 포함하거나 인수를 포함하지 않아야 한다.
다음 선언은 대괄호를 과부하한다.
return_type operator[] (argument)
Bracket 내부의 내용은 에 명시되어 있다.argument
일부분할하다
둥근 브래킷도 비슷한 방식으로 과부하되어 있다.
return_type operator() (arg1, arg2, ...)
조작자 호출에 있는 브래킷의 내용은 두 번째 브래킷에 명시되어 있다.
위에서 지정한 연산자 외에 화살표 연산자(->
(), 별표 화살표().->*
(),new
키워드와 더delete
키워드도 오버로드될 수 있다.이러한 메모리 또는 포인터 관련 운영자는 과부하 후 메모리 할당 기능을 처리해야 한다.할당과 같은 (=
) 연산자, 그들은 또한 특별한 선언이 이루어지지 않을 경우 기본적으로 과부하된다.
시공자
![]() | 이 절의 사실적 정확성은 논쟁의 여지가 있다.(2009년 1월) (이 를 과 시기 |
때때로 프로그래머들은 선언할 때 그들의 변수가 기본값이나 특정한 값을 취하기를 원할 수 있다.이것은 건설업자를 선언함으로써 이루어질 수 있다.
사람::사람(끈을 매다 이름을 붙이다, 인트로 나이를 먹다) { 이름_ = 이름을 붙이다; 나이_ = 나이를 먹다; }
멤버 변수는 아래 예와 같이 콜론을 사용하여 이니셜라이저 목록에서 초기화할 수 있다.이는 할당 연산자를 사용하는 것이 아니라 (시공자를 사용하여) 초기화한다는 점에서 위와 다르다.이것은 클래스 종류에 더 효율적이다. 왜냐하면 그것은 단지 직접적으로 구성되어야 하기 때문이다. 반면에, 할당을 할 때는, 그들은 먼저 기본 생성자를 사용하여 초기화되어야 하고, 그리고 나서 다른 값을 할당해야 한다.일부 유형(예: 참조 및const type)을 에 할당할 수 없으므로 이니셜라이저 목록에서 초기화해야 한다.
사람(찌꺼기::끈을 매다 이름을 붙이다, 인트로 나이를 먹다) : 이름_(이름을 붙이다), 나이_(나이를 먹다) {}
곱슬곱슬한 교정기는 비어 있어도 생략할 수 없다는 점에 유의하십시오.
기본값은 기본값을 초기화하는 데 도움이 되는 마지막 인수에 지정할 수 있다.
사람(찌꺼기::끈을 매다 이름을 붙이다 = "", 인트로 나이를 먹다 = 0) : 이름_(이름을 붙이다), 나이_(나이를 먹다) {}
위의 예에서 생성자에게 인수가 주어지지 않을 때는 인수(기본 생성자) 없이 다음 생성자를 호출하는 것과 같다.
사람() : 이름_(""), 나이_(0) {}
생성자의 선언은 데이터 유형과 이름이 같은 함수처럼 보인다.사실 시공자에 대한 호출은 함수 호출의 형태를 취할 수 있다.이 경우 초기화됨Person
형식 변수는 반환 값이라고 생각할 수 있다.
인트로 본래의() { 사람 r = 사람("와일즈", 40); r.인쇄하다(); }
위의 예와 동일한 작업을 수행하는 대체 구문은 다음과 같다.
인트로 본래의() { 사람 r("와일즈", 40); r.인쇄하다(); }
변수와 관련되거나 관련되지 않을 수 있는 특정 프로그램 조치는 생성자의 일부로 추가할 수 있다.
사람() { 찌꺼기::뻐드렁니가 나다 << "여보세요!" << 찌꺼기::끝을 맺다; }
위의 생성자와 함께, 기본 설정 시 "Hello!"가 인쇄된다.Person
생성자를 호출한다.
기본 생성자
클래스에 대해 생성자가 정의되지 않은 경우 기본 생성자를 호출한다.
구조상의 A { 인트로 b; }; // 괄호를 사용하여 만든 개체. A* a = 새로운 A(); // 기본 생성자를 호출하면 b는 '0'으로 초기화된다. // 괄호 없이 만든 개체. A* a = 새로운 A; // 메모리를 할당하고 나서 기본 생성자를 호출하면 b의 값이 '0'이 된다. // 새 항목 없이 개체 생성 A a; // 스택의 a에 대한 공간을 예약하면 b는 알 수 없는 가비지 값을 갖게 된다.
그러나 사용자 정의 생성자가 클래스에 대해 정의된 경우, 위의 두 선언 모두 이 사용자 정의 생성자를 호출하여 정의된 코드가 실행되지만 기본값은 변수 b에 할당되지 않는다.
소멸자
![]() | 이 절의 사실적 정확성은 논쟁의 여지가 있다.(2009년 1월) (이 를 과 시기 |
파괴자는 생성자의 역이다.클래스의 인스턴스(instance)가 파괴될 때, 예를 들어 블록(closing brace "{}"의 곱슬 가새 집합)에서 생성된 클래스의 객체가 클로징 가새 이후에 삭제되면 소멸자가 자동으로 호출된다.변수를 저장하는 메모리 위치를 비우면 호출된다.소멸자는 해당 클래스의 인스턴스가 파괴될 때 힙 할당 메모리 및 열린 파일과 같은 리소스를 해제하는 데 사용될 수 있다.
파괴자를 선언하는 구문은 생성자의 구문과 유사하다.반환값은 없으며, 메소드 명칭은 앞에 틸드(~)가 있는 클래스 이름과 동일하다.
~사람() { 찌꺼기::뻐드렁니가 나다 << "삭제한다" << 이름_ << " 나이와 함께 " << 나이_ << 찌꺼기::끝을 맺다; }
생성자와 소멸자 간의 유사성
- 둘 다 선언된 클래스와 이름이 같다.
- 사용자에 의해 선언되지 않은 경우, 둘 다 기본적으로 클래스에서 사용할 수 있지만, 이제 개체가 선언되거나 삭제될 때만 클래스의 개체로부터 메모리를 할당 및 할당 해제할 수 있다.
- 파생 클래스의 경우:기본 클래스 생성자의 런타임 동안 파생 클래스 생성자는 아직 호출되지 않았으며, 기본 클래스 소멸자의 런타임 동안 파생 클래스 소멸자는 이미 호출되었다.두 경우 모두 파생 클래스 멤버 변수가 유효하지 않은 상태에 있다.
클래스 템플릿
C++에서는 클래스 템플릿에서 클래스 선언을 생성할 수 있다.그러한 클래스 템플릿은 클래스 가족을 나타낸다.실제 클래스 선언은 템플릿을 하나 이상의 템플릿 인수로 인스턴스화하여 얻는다.특정 인수 집합으로 인스턴스화된 템플릿을 템플릿 전문화라고 한다.
특성.
C++의 구문은 구조의 모든 측면을 기본 데이터 유형과 비슷하게 보이게 하려고 한다.따라서 과부하 연산자는 정수와 부동 소수점 숫자처럼 구조를 조작할 수 있게 하고, 구조 배열은 정사각형-브래킷 구문(square-bracket syntax)으로 선언할 수 있다.some_structure variable_name[size]
() 및 구조물에 대한 포인터는 내장 데이터 유형에 대한 포인터와 동일한 방법으로 참조 해제할 수 있다.
메모리 소비량
구조물의 메모리 소비량은 적어도 구성 변수의 메모리 크기의 합이다.테이크 더TwoNums
예로서 아래를 구성하다
구조상의 투Nums { 인트로 a; 인트로 b; };
그 구조는 두 개의 정수로 이루어져 있다.많은 현재 C++ 컴파일러에서 정수는 기본적으로 32비트 정수여서 각 멤버 변수는 4바이트의 메모리를 소비한다.따라서 전체 구조는 다음과 같이 최소 8바이트의 메모리를 소비한다(또는 정확히).
+----+----+ a+++++++++++++++++
그러나 컴파일러는 주어진 컴퓨터 아키텍처에 적절한 데이터 정렬을 보장하기 위해 변수 사이에 패딩을 추가하거나 구조물의 끝에 패딩(흔히 32비트 정렬)을 추가할 수 있다.예를 들어, 구조물은
구조상의 BytesAndSuch { 마를 뜨다 c; 마를 뜨다 C; 마를 뜨다 D; 키가 작은 인트로 s; 인트로 i; 곱절로 하다 d; };
처럼 보일 수 있다
+-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
메모리, 여기서 X는 4바이트 정렬에 기반한 패딩된 바이트를 나타낸다.
구조물이 포인터와 배열을 사용하여 그 멤버 변수를 선언하고 초기화할 수 있기 때문에 구조물의 메모리 소비량이 반드시 일정하지는 않다.일정하지 않은 메모리 크기의 또 다른 예는 템플릿 구조다.
비트 필드
비트 필드는 통합형보다 적은 저장 공간을 차지할 수 있는 클래스 멤버를 정의하기 위해 사용된다.이 필드는 일체형(int, char, short, long 등)에만 적용되며 플로트 또는 더블을 제외한다.
구조상의 A { 서명이 없는 a:2; // 가능한 값 0..3, int의 처음 2비트를 차지함 서명이 없는 b:3; // 가능한 값 0..7, 다음 3비트의 int를 차지 서명이 없는 :0; // 다음 적분 유형의 끝으로 이동 서명이 없는 c:2; 서명이 없는 :4; // 4비트를 c와 d 사이에 패드 서명이 없는 d:1; 서명이 없는 e:3; };
- 메모리 구조
4 byte int 4 byte int [1][2][3][4][5][6][7][8] [1] [2] [3] [4] [a][a][b][b][b][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [5] [6] [7] [8] [c][c][ ][ ][ ][ ][d][e] [e][e][ ][][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ]
비트 필드는 조합에서 허용되지 않는다.그것은 키워드 구조체나 클래스를 사용하여 정의된 클래스에만 적용된다.
참조로 전달
많은 프로그래머들은 구조를 포함하는 함수의 주장을 선언하기 위해 앰퍼샌드 (&)를 사용하는 것을 선호한다.이는 비참조 암퍼스 및 단 하나의 단어(일반적으로 32비트 머신에서 4바이트, 64비트 머신에서 8바이트)만을 사용하여 함수, 즉 변수에 메모리 위치를 전달해야 하기 때문이다.그렇지 않으면 값별 패스를 사용할 경우 함수가 호출될 때마다 인수를 복사해야 하는데, 이 인수는 큰 구조로 비용이 많이 든다.
기준 통과는 함수에 의해 수정될 원래의 구조를 노출하기 때문에,const
키워드를 사용하여 함수가 매개 변수를 수정하지 않도록 보장해야 한다(구성-수정 참조).
이 키워드
구조물의 참조 능력을 촉진하기 위해 C++는this
모든 구성원 기능에 대한 키워드.그this
키워드는 현재 객체에 대한 포인터 역할을 한다.[11]그것의 유형은 현재 객체에 대한 포인터 유형이다.
그this
키워드는 구조 자체를 반환값으로 하는 회원 기능에서 특히 중요하다.
콤플렉스& 운영자+=(경시하다 콤플렉스& c) { real_part_ += c.real_part_; imag_part_ += c.imag_part_; 돌아오다 *이; }
상술한 바와 같이this
포인터가 되므로 반환할 참조로 변환하기 위해 별표(*)를 사용해야 한다.
참고 항목
참조
- ^ a b ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ §9 클래스 [class] para.4
- ^ ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ §8.5.1 Aggregate [dcl.init.aggr] para.1
- ^ ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ §8.5.1 Aggregate [dcl.init.aggr] para.2
- ^ "What's this "POD" thing in C++ I keep hearing about?". Comeau Computing. Archived from the original on 2009-01-19. Retrieved 2009-01-20.
- ^ Henricson, Mats; Nyquist, Erik (1997). Industrial Strength C++. Prentice Hall. ISBN 0-13-120965-5.
- ^ ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ §9.2 클래스 멤버 [class.mem] 단락 12
- ^ ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ §9.2 클래스 멤버 [class.mem] 단락 14
- ^ a b ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ §9.2 클래스 멤버 [class.mem] 단락 17
- ^ ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ §18.1 유형[lib]support.properties] para.5
- ^ "thiscall (C++)". Retrieved 2009-01-26.
- ^ "this". C++ Reference.
일반 참조:
- Cplusplus.com 튜토리얼 5.2, 2006년 1월에 액세스
- Cplusplus.com 튜토리얼 2.5, 2006년 2월에 액세스