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

+ Recent posts