C++ auto
기능 : C++11부터 auto 의미 수정 : 컴파일러에게 변수선언문에서 추론하여 타입을 자동 선언하라 지시
장점 : 복잡한 변수 선언을 간소하게, 긴 타입 선언 시 오타 줄임
활용 사례
1. 함수의 리턴 타입으로 추론하여 변수 타입 선언
ex)
int squ(int x) {return x*x;}
auto ret=squ(3);
2. STL 템플릿 활용
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
cout<<*it<<endl;
=>
for(auto it=v.begin();it!=v.end();it++)
cout<<*it<<endl;
람다 (익명 함수) : C++11에 도입
- 람다 대수와 람다식
f(x,y)=x+y // 수학 함수 f
(x,y)->x+y // 함수 f의 람다식
(x,y)->x + y(2,3) = 2+3 = 5 // 람다식 f 계산
람다식의 구성
1. 캡쳐 리스트 // 사용하고자 하는 함수 바깥의 변수 목록
2. 매개변수 리스트 // 보통 함수의 매개변수 리스트
3. 리턴 타입
4. 함수 바디
[1](2)->리턴타입{함수 바디}; //람다식의 기본 구조
auto를 이용해 람다식을 변수에 저장도 가능
ex)
double pi=3.14;
auto calc = [pi](int r)->double{return pi*r*r;};
cout<<calc(3);
참조자를 통해 지역 변수 값 변경 가능
ex)
int sum=0;
[&sum](int x,int y){sum=x+y;}(2,3);
STL for-each()함수 사용
#include <algorithm> //for-each() 알고리즘을 위해
for_each(v.begin(),v.end(),print);
-> v.begin에서부터 v.end까지 실행하며 각 원소에 대하여 print함수 호출(매개변수 n에 전달)
- 이를 람다식으로 표현
=> for_each(v.begin(),v.end(),[](int n){cout<<n<<"";});
컴파일 오류
- 문법에 맞지 않는 구문으로 인한 오류
실행 오류
- 개발자의 논리 오류
- 예외적인 입력에 대해 대처가 없을 때 발생
- 실행 오류 결과 : 엉뚱한 코드 실행 or 프로그램 비정상 종료
예외 처리 방법
1. if문과 리턴 값을 이용한 오류 처리
2. try-throw-catch
try : 예외 발생 가능성 있는 코드 묶음
throw : 발견된 예외 처리를 위해 예외 발생 알림 (try블록 안에 있어야함)
catch : throw에 의해 발생된 예외를 처리하는 코드
ex)
try
{
throw 3.5;
throw "음수";
}
catch(double d){}
catch(const char* s){}
예외처리기 : 예외 발생 탐지 후 예외를 처리하는 코드
예외 처리 수준
1. 운영체제 수준 예외 처리 // 운영체제와 컴파일러 의존적인 C++ 문법
2. 응용프로그램 수준 예외 처리 // C++ 예외 처리
try안에서 함수를 실행 하고 함수에서 throw를 던져도 함수 밖 catch에서 예외를 처리한다.
예외를 발생시키는 함수는 다음과 같이 선언 가능(함수 원형 + throw(예외 타입))
ex)
int max(int x, int y) throw(int){}
double ValueAt(double* p, int index) throw(int, char*){}
장점 : 프로그램 작동 명확히 함, 가독성 높임
catch(...) //어떤 예외 타입이든 다 받을 수 있다.
try 블록 안에 try블록 중첩 가능
try안의 try블록에서 예외처리를 실패하면 try블록 밖의 catch로 가서 처리
catch블록 안에 try 블록 선언 가능
예외 값 종류
- 기본 타입의 예외 값
- 객체 예외 값(예외 값으로 객체 던지기 가능)
예외 클래스
- throw로 객체를 던짐
예외 클래스도 생성이 가능하다. //객체를 던지는 것은 정보가 많다.
ex)
class Exception{...}
main()
{
throw Exception(a,b,...);
}
catch(Exception &e){...}
C언어 이름 규칙
- 이름 앞에 밑줄표시문자(_)를 붙인다.
C++ 이름 규칙
- 함수 매개 변수 타입과 개수, 리턴 타입에 따라 복잡한 이름
두 이름 규칙이 다르기에 C++컴파일러로 해석한 것과 C컴파일러로 해석한 것을 링킹할 때 링킹 오류 발생
extern "c"
- C 컴파일러로 컴파일을 지시
1. 함수 하나만 선언
extern "C" int f(int x);
2. 여러 함수 선언
extern "C"
{
int f(int x);
void g();
char s(int []);
}
3. 헤더파일 통째로 선언
extern "C"
{
#include "myfunction.h"
}
'학교수업' 카테고리의 다른 글
사물인터넷의 이해 10주차 (0) | 2021.12.16 |
---|---|
<시험 정리> 임베디드 기초 (0) | 2021.12.12 |
정보보호개론 14주차 (0) | 2021.12.10 |
가상현실프로그래밍 14주차 (0) | 2021.12.09 |
임베디드 기초 13주차 (0) | 2021.12.09 |