: 클래스의 멤버함수는 데이터 영역에 저장됨. 멤버 함수를 호출할 경우, this 포인터가 첫번째 인자로 전달됨. class Point{ public : void Set(int \_x, int \_y) { }}\-> 호출 시 실제로는 이런 형
dddd
멤버 변수의 값을 string 으로 만들어서 출력하는 기능을 만든다고 한다면이런식의 클래스를 구현할 수 있음.\-> 하지만, 지역변수를 반환하는 것이므로 쓰레기값이 나옴을 확인할 수 있음.\--> 그래서 static으로 변경함.이전 시간에 배웠지만, 함수 내에서 변경되
: 선택이 아닌 필수다!안정성 때문이 아닌 반드시 필요! 상수 객체로 사용할 경우, 값 설정은 물론 불가능하지만, 출력의 경우 , const를 사용하지 않으면 error가 발생함.그런데 상수 객체가 반드시 필요한가 에 대한 생각을 할수 있음.\-> 매개변수로 객체를 보
ㅇㅇㅇ
같은 이름의 함수를 만들었으나, 어셈블 단계에서는 매개변수나 반환형 타입에 따라 함수의 이름을 따로 만들어주는 것을 말함.
1) 파생 클래스 생성자 호출 시, 기반 생성자가 호출완료된 후에,파생 생성자 블록으로 진입함. 2) 파생 생성자에서 초기화로 기반 생성자 호출을 명시하지 않으면, 기반의 디폴트 생성자가 호출됨. 3) 기반에서 인자가 있는 생성자를 작성할 경우, 컴파일러는 디폴트 생성
1) 클래스에 멤버로 다른 객체가 존재할 경우, 해당 클래스의 생성자에 컴파일러가 암묵적으로 디폴트 생성자를 호출하는 코드를 만들어 놓음.1 의 내용을 코드로 만들어서 확인하라. 멤버로 사용되는 클래스의 디폴트 생성자를 제거해보아라. \-> 어떻게 될까? 어떤것이 먼저
: 이전 내용에서 상속과 멤버가 함께 존재할 경우, 기반이 먼저 호출됨을 확인함. 생성자에서 가상함수가 동작하지 않음. 이유 : 가상함수 포인터와 테이블은 파생 생성자까지 와야 생성이 됨
파생클래스의 생성자 호출시 , 기본 클래스의 생성자가 먼저 호출됨.기반 클래스의 생성자는 암시적으로 디폴트 생성자가 호출됨.기본 클래스의 디폴트 생성자가 없다면, 유저가 파생클래스의 이니셜라이저에서 오버로딩 생성자를 지정해야함.주의할 점이 또 있음.\-> 기본 클래스의
: 사소한, 하찮은 이라는 의미를 가짐. c++에서는 기본 생성자가 하는 일이 없을 때를 말함. 예시 코드 1번 ( 가상함수가 있을 때): 결과는 false가 출력됨. \-> 기본생성자가 없지만, A클래스의 경우, 디폴트생성자가 func 가상함수에 대한 가상함수 포인터
: 객체를 다른 타입으로 변경시킬 때, 사용되는 연산자. but, 변환 연산자를 이용해 캐스팅이 가능하게 할 수 있음.이렇게.. \-> 반환 타입에 신경 쓸 필요 없음. operator 뒤에 type이 뒤따라오므로..: 기본 타입을 객체로 대입시킬 때 호출되는 생성자.
c++에서는 nullptr은 주소값을 0x00000으로 하는 것이고,NULL은 그냥 정수 0이다. c++에서는 변환연산자를 통해 암시적 형변환을 하려고 한다!! 그림을 보면, 컴파일러가 인자를 어떻게 해서든 암시적 형변환을 하려는 시도를 하고 있음. : 1번 foo를
기존의 템플릿 코드를 만들면, 템플릿 인자를 전달을 했음.: 아래의 코드와 동일하게 우변의 타입을 보고 , 우변의 리턴값을 결정하는 방법.
ㅇㅇㅇ
assert( expr ) 실행시간에 expr이 거짓이면, 메시지를 출력하고, 프로그램을 종료시킴. static_assert ( 조건식, "종료출력문" ) 개념 > 컴파일 시간에 조건식이 거짓이라면, msg를 출력하고, 컴파일을 멈추게함. static_assert
보통 stl 컨테이너 멤버를 사용했음.\-> 변수.begin(), 변수.end()를 사용함.특징 : 일반 배열의 경우 사용할 수 없음. begin() , end() 함수 형식으로 인자를 넣어서 사용하자. 가) template show 함수를 만들어라. 일단은 멤버 형식
for(auto iter : v){ cout << iter << endl;}사실 이렇게 만들어 진다고 함. for(auto iter = begin(v); iter != end(v); ++iter){ cout << iter <<
: 해당 함수를 제공하지 않는 함수. \-> 타입이 다르지만, 컴파일러가 형변환으로 데이터를 잘라서 정수형으로 처리함선언만 할 경우\-> 링크에러가 발생함. 왜냐하면, 선언은 되어 있으므로 컴파일은 되지만, 실제로 함수의 정의부가 없어서 발생하는 문제delete를 사용
: 예외가 없음을 알리는 문법.: 함수 뒤에다가 noexcept를 작성하자. 함수 내부에서 throw 불가함.
: 기존 enum의 단점을 보완하는 enum문 기존 enum: 타입의 이름, 소속 없이 아무데서나 사용이 가능함. \-> 암시적으로 형변환되는 것임.\-> 코드 가시성에 링크되지 못함. 가) enum문으로 작성 하라.나) scoped enum으로 작성하라.
: 하나의 생성자에서 다른 생성자를 호출하는 문법. : 여러개의 생성자에서 동일한 방법으로 초기화 할 경우, 사용됨.즉 Point()를 이용해 Point( int a, int b)를 호출해 초기화를 진행하는 것임.생성자 내에서 생성자 호출은 임시객체를 생성하는 것임.이
\-> 파생 클래스에서 기반 클래스의 멤버함수 foo의 인자 갯수를 동일하게 하고, 작성할 경우 이는 재정의(오버라이딩)에 해당함.\-> 파생 클래스에서 인자의 갯수를 다르게 한 상태이것이 의미하는 바는? 파생 클래스에서 사용되는 함수로 인해 기반 클래스의 foo (인
ddd
https://karupro.tistory.com/24https://boycoding.tistory.com/181: 복사 대입 연산은 복사지만, 중괄호 복사는 직접 초기화가 이루어짐.암묵적인 형변환을 차단함.기본적으로 대입 연산은 복사가 이루어짐, i
: 초기화 시에 '=' 대입을 사용하지 않는 것을 말함. 1) () 2) {}: 초기화시에 '=' 대입을 사용하는 초기화를 말함. direct 초기화의 경우 임시객체 생성 없이 객체 그 자신을 바로 만듬copy 초기화는 암시적 형변환을 통해 , 변환 생성자를 호출함.
변수를 선언만 한 상태 : default initialization \-> 쓰레기값으로 설정됨.중괄호를 작성한 상태 : value initialization \-> 0으로 초기화 됨. 예시 코드 : cl 컴파일러는 지역변수 초기화하지 않았따는 오류를 발생시킴.
: {} 중괄호로 초기화가 가능한 것을 말함. 구조체나 배열 구조체의 경우, 내부에 생성자나 가상함수가 있다면, 컴파일러가 클래스로 보기 때문에, aggregate초기화가 불가함. 예시 코드 가) 가상함수를 추가하자.나) 가상함수 지우고, 생성자를 추가하자.
우변 수식이 가진 참조, const, volatile 속성을 제거하면서, 타입이 결정됨. problem 예시 코드 : 아래의 변수들을 auto로 받은 후, typeid를 출력하라.: 우변 수식이 가진 참조 속성을 제거되고, const, volatile속성을 유지됨.
: 배열의 이름은 배열의 주소로 알아왔지만, 잘못된 개념임. : 선언문에서 변수의 이름을 빼면, 해당 변수의 타입이 결정됨. 예시 int n; 변수 이름은 : n , 타입은 : int double d ; 변수 이름은 : d, 타입은 : double int arr3; 변
: 컴파일러에 의해 만들어지는 임시 메모리 공간.사용자에 의해 만들어지기도 함. 일반적인 객체를 만드는 것이 아닌, 객체명 제외하고, 생성자를 호출하는 식으로 작성하자.: 세미콜론의 끝에서 소멸됨. // 함수의 블록이 아닌.
외워야 함.임시객체는 lValue가 될 수 없다는 특성을 이용해서 확인해 보아라.
지역 객체를 반환한다는 것은 참조로 반환을 하든 값으로 반환을 하든, 임시객체를 생성함. : Rvalue를 받을 수 있는 참조 참조 2개를 사용함. Rvalue 상수 / 리터럴값.임시객체 주소가 없음.값을 리턴하는 모든 경우 (임시객체)LValue주소를 가지고 있음.참
: 참조를 using으로 선언한 다음. 참조와 함께 사용할 시에 발생하는 현상.그림.결과 : a, b의 에러 메시지를 확인해보면? : 참조에 대한 참조를 사용할 수 없다고 함. 하지만, using으로 선언한 LREF, RREF는 가능함. 규칙이 있음. & & -> &&
: 레퍼런스 충돌을 통해서 // 이러한 함수가 있을 때 , 물음표에 들어가는 것은?lvalue일까? rvalue일까? template void f2(T& a) {} int main() { int n; f2( ?? ) f2<int&>( ?? );
참조 형태로 선언해야 함. 값을 불가함. 그림 1) 매개변수로 객체가 전달되고, 복사되어서 객체 p가 만들어짐.2) 그러면 다시 복사 생성자가 호출되는 형태3) 결과 : 복사 호출이 재귀적으로 발생하게 됨.결론 : 오류를 보면, 컴파일러가 만드는 방식을 제한 하고 있음
: 클래스 멤버 데이터가 포인터가 있는 상태에서 ,디폴트 복사 생성자가 호출되면, 두 객체의 포인터가 하나의 메모리를 공유하면서 발생하는 문제 : char \* name, int age 를 멤버로 가지고 있는 Cat 클래스를 만들어라. name은 strcpy를 사용1번
: 기존의 lvalue의 자원을 이전하고 싶은 경우가 있음. 그림이를 대체하는 키워드 move가 있음. : 복사생성자와 이동생성자 2개를 모두 만드는 것처럼.대입연산자와 이동연산자를 모두 만들어주자. 초기화가 된 객체에 한해, 소유권을 이전 할 수 있기 때문임. 예제대
일반적인 swap을 템플릿 형태로 구현하라. 객체 t1, t2를 swap 하라. 잘 생각을 해보면, 복사가 3번이 발생함. 하지만 이전에 배운 move를 사용하면, 복사도 발생하지 않고, 바로 소유권을 이전하므로 훨씬 효율적임. 클래스 Test를 만들고, 이동 생성자,
a에서 c로 move는 성공했찌만, b에서 d로 이동할때 예외가 발생했다.c++에서는 예외가 발생할 수 있다고 생각한다면, 원본 데이터를 보장하기 위해서 move 를 하더라도 복사가 이루어지게 함. is_nothrow_move_constructible : 클래스의 이동
이전시간까지 큰 배열에 작은 배열 포인터를 이전하는 작업을 함. but, 생각을 해보면, 큰 포인터의 2개 배열 원소를 굳이 참조를 할 필요는 없음. resource를 의미하는 것임. : 아래의 그림에서는 오른쪽 4개의 메모리를 할당하고, 생성자가 호출된 상태임. :
ㅇㅇ
ㅇㅇㅇ
move 생성자 만들기 예제
: 네이버 블로그로 고고
//출처는 코드누리 c++ intermediate 강좌 입니다. //강의를 보고 정리, 안보고 타이핑 동일한 기능을 하는 코드를 설계하는 방법은 2가지가 있음.1\. define 전처리기를 사용. \-> 타입을 추론할 수 없음. \-> 전처리기에서 처리하므로 오
: 컴파일러가 template형식 호출된 타입을 보고, 실제 사용될 함수를 만들어내는 과정. 명시적 인스턴스화와 암시적 인스턴스화가 있음.: 미리 어떤 타입을 사용할 것이라는 것을 선언함. //디파인 사용하는 것처럼.: 선언 없이, 컴파일러에 의해 템플릿화 되는 것을
: 인자를 통해서 타입을 추론할 수 있음.\-> make_pair, make_tuple 함수의 경우 : 인자를 통해 타입을 추론할 수 있으나, c++17에 해당함.클래스 템플릿에서 형을 명시해던 것을 함수 템플릿을 이용해 암묵적인 형태로 나타낼 수 있음. 안보고 만들어
ㅇㅇ
: 인라인 함수의 치환을 적용하려면 프로젝트 설정을 해야함.//참고http://insidecoding.blogspot.com/2015/10/inline-function.html설정 하지 않으면, 설정하면, call되지 않고, 치환 처리 되는 것을 확인할 수 있
: 기본 템플릿을 갖추고 있는 상황에서 특정한 자료형에 대한 처리를 하는 템플릿반드시 기본 템플릿이 있어야 함.\-> 노락색 네모칸이 템플릿 특수화를 나타낸 것임. \-> 여기서는 첫번째 인자가 포인터로 진입할 경우에 대한 템플릿 특수화임.//기본 템플릿이 있기 때문에
: 동적 할당한 자원을 알아서 해제하는 객체를 말함. 개념을 가지고 생각을 해보면,,, 1\. 하나의 클래스 안에 포인터 객체를 구성하고, 소멸자에서 해제를 하면 됨. 2\. 추가적으로 포인터 객체를 사용하기 위한 연산자 오버로딩을 구현하면 됨.위의 내용을 토대로 구현
: 객체를 함수처럼 사용하는 것을 말함.c++에서는 연산자 재정의가 가능함. 이때 괄호 연산자에 대한 재정의도 가능함. 괄호를 2개 사용함.
\-> mutable을 사용해야 함. \-> 분리함.
: 메모리만 할당함.: 생성자만 호출함.: Point 클래스의 경우, (디폴트 생성자 없음.)\-> new 연산자로는 10개 할당 불가능함.
1번 .일반적인 RAII는 비연속적인 메모리 구조를 통해, 객체와 제어블록을 할당함.2번 . make_shared는 연속적인 메모리 구조로 되어 있는, 객체와 제어블록을 할당함.
auto는 어떠한 방법으로 타입을 결정할까? 우변 수식이 가진 참조, const , volatile 속성을 제거하고, 타입을 결정함.int 변수, int& 변수, const int 변수, const int & 변수를 초기화하고,이를 auto 받아서 타입조사를 해보아라.
네이버 블로그로.
기존의 멤버함수는 객체의 타입(lvalue든 rvalue든 )에 상관없이 호출이 가능함. 참조 한정 메서드가 나타났는데, 이 친구는 returnType funcName() 참조 한정자식으로 함수() 연산자 뒤에 & 참조자를 작성하는 방식으로 사용함. 반환타입 함수이름