수업기록 CPP 수업의 사실 상 마지막 모던 CPP의 기초를 마지막으로 함 (11 기준으로) 모던 CPP는 11이후로 등장한 것을 통칭으로 말함

예외처리

예외처리

int iNumber1(0), iNumber2(2);
int iNumber3 = (iNumber)/(iNumber2); //0 나누기는 안되는 건데
 
try{
	if(iNumber2 == 0)
		throw iNumber;
	int iNumber3 = (iNumber)/(iNumber2); // 여기는 예외처리가 됨.
}
catch(int){
	cout<<"잘못된 입력"<<endl;
}

try와 catch 사이에 새로운 코드가 삽입되어서는 아니됨. throw는 “가장 가까운” catch문으로 이동 시킴. goTo 마냥. 예외처리 필기


auto

auto

사용자가 직접 타임을 지정하지 않아도 변수 상태에 맞게 자료형을 결정지어주는 키워드 컴파일러의 추론에 의하여 결정

auto a = true;
auto b= 'a';
auto c =10;
 
auto  p = new CObj;
auto&  r = c;

auto는 STL과 결합이 많이 되는 경우가 많다.

vector<int> vecInt;
 
vecInt.push_back(10);
vecInt.push_back(10);
vecInt.push_back(10);
vecInt.push_back(10);
 
auto iter = vecInt.begin();

range_for

범위 기반 for문

범위기반 for문 해당 사항은 위 필기 참고


유니폼 초기화

2025-04-03 수업에 언급

mapInt.insert({1,100});
int iArray[5]{1,2,3,4,5};
struct TagInfo{1,2,3,4,5};

클래스 안에서도 유니폼 초기화 가능 / 생성자 안, initialize list 에서도 가능

class CObj{
public : 
	CObj(struct) : m_struct{struct}{};
}

STL도 가능함

vector<int> vecInt{1,2,3,4,5};
map<int,int> mapInt{{1,2},{2,3},{3,4}};

람다함수

람다식 : 함수 객체를 대체하기 위한 문법

람다함수와 함수 객체에 대한 필기 이름이 없는 Inline 함수(익명의 함수) 그렇기에 이름이 없기 때문에 함수의 오버로딩이 불가함

람다식의 예시

[](int i){cout << n<< endl;} //리턴 타입의 생략(void) or 묵시적 반환
 
[](int n) -> bool {return (n%2) == 1;} //리턴 타입의 명시적 반환
 
 
//캡처 리스트의 활용
int iEvenSum(0);
int iOddSum(0);
 
[&](int n){ 
	if(0 == n%2){
		iEvenSum += n; 
	}else{
		iOddSum += n;
	}
} 
 

[] : 람다 소개자 / 캡처절, 캡처 리스트 , 해당 연산자를 확인하고 컴파일러가 람다식임을 인지함 () : 파라미터 지정자 , 일반 함수 파라미터와 동일 {} : 람다 몸체

캡처의 복사 방식 & 붙이지 않게 되면 const형태의 복사본을 가져와서 함수 내부에서 값을 바꿀 수 없게 된다. mutable키워드를 붙이게 되면 값을 바꿀 수 있지만, “복사본”이기에 원본에 반영이 되지 않음.

&을 붙이면 그 레퍼런스를 가져온다는 것이기에, 원본에 반영이 됨

[&,=x] x만 복사 나머지는 레퍼런스 캡처

[=] : 외부의 모든 변수를 복사본으로 캡처(const 아님) [=a] : 외부에 정의 되어 있는 a를 복사하여 캡처 [this] : 클래스 내부에 정의되어 있는 멤버 변수를 사용할 때 [&] : 외부의 모든 변수를 레퍼런스로 캡처

모두를 뜻하는 기호는 뒤에 들어갈 수 없고, 데이터 영역의 변수(static / 전역)는 사용할 수 없음.

R_Value_Reference

R_value 레퍼런스

우측값 레퍼런스에 대한 필기

r_value레퍼런스를 사용하면 자동으로 l_value로 형변환 해짐. 임시객체는 리터럴 형태로 판단을 하기 때문에.

STL 컨테이너에 인자를 넣을 때 r_value 레퍼런스로 받기 때문에 빠르다.


이동생성자

이동 생성자

이동 생성자에 대한 필기

: 명시적인 구현이 있어야 호출이 가능하게 됨.