728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

복사생성자

c,java(대신 클론함수 생성해서 구현하긴 한다)에는 없다

Vector(const Vector& other);

다른 개체를 이용하여 새로운 개체를 초기화

암시적 복사 생성자(얕은 복사) 기본 복사 생성자는 없으면 알아서 만들어준다.

 

얕은복사 , 깊은복사 String(const String& str)

클래스에 포인터형 변수가 있으면? 얕은 복사의 경우 문제가 된다. (데이터 공유로 인한.. 데이터 수정 데이터 삭제등)

이럴경우 직접 깊은복사 생성자를 구현해야한다.

 

연산자 오버로딩

 

friend 키워드

클래스나 함수시그니처에 지정 가능

다른 클래스나 함수가 나의 prviate 또는 protected멤버에 접근할 수 있게 허용

(약간 oop 안티패턴  friend를 남발하면 문제가될듯..)

자바는 유사하게 접근지정자를 지정안하면 한 package안에서 서로 클래스간에 접근가능하게 한다.

 

연산자 오버로딩과 const

기본적으로 매개변수 메소드에 전부 const를 붙이고 작업하는게 좋다. 컴파일시 문제가 될때 const를 제거하는 식으로

 

연사자 오버로딩 남용하지말것

모든 자유로운것에는 실수의 여지를 준다. 조심히 사용해야함.

차라리 함수를 만들어라.

 

대입연산자

대입연산자도 복사 생성자와 비슷역할을 하나 생성, 소멸되는 과정 처리가 안되어 있음

복사 생성자를 구현하면 대입연산자도 구현해야할 수 있음. 

대입연산자도 기본으로 생성된다.

 

암시적 함수들을 제거할 수 있다

기본함수들 생성자, 복사생성자, 소멸자,대입연산자

private 영역안에 선언해 놓는다. (전통적인 방식)

 

 

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

c++ OOP특징

 

클래스

개체

생성자

함수 오버로딩

힙에 개체 생성하기

 

(자바에서는 불가능)

스택에 개채 생성하기

복사 생성자

소멸자

연산자 오버로딩

 

 

oop 핵심 개념  == 사람들이 세상을 바라보는 방식

 

java,c#은 클래스 인스턴스화시 멤버를 초기화값 (정수는 0)으로 초기화한다.

c++는 멤버를 메모리할당만하고 가비지 값 상태로 그대로 둔다

 

c에 없는 기능이 다른 언어에 있다면 누군가 구현한 것이고 어떻게 구현했을까 생각해보기


new/delete  와 malloc/free 의 차이는?(스스로 찾아보기)

malloc은 메모리 동적할당만 가능하고 초기값을 지정할 순 없다.

new는 할당과 동시에 초기화가 가능하다. 대신 malloc은 realloc으로 재할당이 가능하다. 

 

C++는 초기화리스트를 통해 생성자에서 초기화한다

 

기본 생성자는 없으면 자동적으로 만들어준다. 생성자가 있으면 기본생성자 만들지 않는다.

 

C++에는 Destructor 소멸자가 있다! 객체 안에서 할당된 메모리를 직접 해제 해줘야한다.

 

메소드에 붙는 const :: 개체를 수정할 수 없다.

 

struct와 class 차이

c++에서 struct와 class는 완전히 똑같다. 다만 기본접근권한이 struct는 public class는 private이다. 

컴퓨터는 struct와 class를 구분하지 못한다. 컴파일러는 구분한다.

c++는 구조체를 클래스처럼 쓸 수 있지만 구조체는 c 스타일로 pod(plain old data) 형태로 쓰자.

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

fstream

파일 스트립에도 조정자 쓸 수 있음

 

close

ifstream(c++)의 경우 scope를 벗어나면 객체가 소멸되면서 알아서 close()된다.

명시적으로 표현하고 싶거나 scope내부에서 일찍 닫고 싶을때 close()를 해준다.

 

get(),getLine(),>> (문자,문장,단어)

 

stream을 읽을때 잘못된 케이스

테스트 케이스를 생각해야한다.

 

eof, failt bit 처리 신경써야함

 

Best practice

여러개의 상황을 가정하고 그 상황을 핸들링하는 역량이 필요.

훌륭한 테이스 케이스를 상정 잘 해야함

 

endl과 \n차이

endl는 flush 된다

 

>>를 getline과 같이 쓰지 말것

 

 

 

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

[C++/공부/강의/POCU3200/정리]string

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

string

string은 배열이 아니라 별도의 클래스다

char[] 을 이용한 string은 배열 크기를 지정해줘야하고

이로 인해 안정성면에서 문제가 생길 수 있다.

string은 이런 문제를 해결해준다.

 

string 관련 메소드

size()

주로 length보다 size를 씀

length()

lenght와 size 차이는 ??

c_str()

const char 배열(c 스타일 문자열) 첫번째 포인터를 반환한다.

c기반으로 돌아가는 경우 프로그램과 동작할 경우 중요한 함수다.

at()

배열 방식을 쓰지 생각보다 많이 안씀. 

 

sstream

string 이 많이 쓰이면 쓴다.

string stream 이라는 소리

 

console이 아니라 string 으로부터 데이터를 읽고 내보내는 스트림

cout,cin의 iostream과 비슷하나 잘 쓰이지 않음

 

C헤더 사용

c++프로젝트에서도 성능상의 이유로 c헤더를 많이 쓴다.

 

그래서 string과 char[] 차이는?

string이 동적으로 length 가 길어나는 과정에서 속도 저하가 생긴다.

 1. 힙메모리할당은 느림

 2. 힙메모리할당에의한 메모리 단편화

 3. 내부버퍼증가로인해 멀티 쓰레드 환경에서 lock처리를 잘못해서 문제가 될수도

 4. c++ 쓰는 업계가 어디인가?

 

c#,java 대신 c++공부를 하는 이유에 대해서 생각하고 편한 기능 이전에

기능의 원리를 이해하고 최적화된 방법을 공부해야겠다.

 

때문에 여전히 sprintf, char[] 를 매우 많이 사용

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

c++의 진짜 전문가는 사용하지 말아야할 기능을 아는 사람

 

Reference(참조)

포인터를 사용하는 좀 더 안전한 방법

c/c++은 포인터 변수를 사용해야 참조에 의한 접근이 가능하다.

c#,java 같은 경우는 기본자료형의 경우에는 값의 의한 접근, 객체(string도 객체타입)는 참조에 의한 접근을 한다.

오히려 c#,java가 포인터를 개념을 없애면서 편의성을 제공하려고 했지만

일관성은 없어 보인다. java는 함수매개변수로 참조의 의한 접근을 위해 ref 키워드를 사용하는 것으로 알고 있다.

c/c++는 함수에서 객체를 매개변수로 받아도 stack에 할당되어 값에 의한 참조가 된다.

 

c++에는 참조의 편의를 위한 int& 가 있다. 

'&변수' 와는 연관이 없으니 헷갈리지 않도록 하자.

실제로 참조와 포인터는 내부적으로 다르지 않다. 

단지 인간의 편의를 위한것.

참조를 별개의 개념으로 보지 않고 단순히 포인터 참조를 

안전하게(?) 가독성 좋게 쓸수 있는 용도? 뿐이라고 생각하는게 맞을거 같다.

참조의 사용은 null처리, 포인터연산 등의 예외처리를 덜어주어 안전하다.

 

`

코딩표준

사용자 실수로 인한 크러쉬를 줄이기 위해 이런 코딩표준을 사용하기도 한다.

 

 

 

 

728x90
728x90

기본적인 포인터 개념은 생략.

 

 

1.

문자열은 cosnt 영역에 생성되므로 문자열을 받는 변수도 const 타입이여야 한다.

2.

문자열 마지막에는 NULL이 포함되어 문자개수+1만큼의 char배열이다.

 

3.

포인터 변수지만 문자열 포인터 변수는 cout-endl에 value가 찍힌다.

가장 혼란스럽게 한부분이다. cout-endl 내부원리를 알아야 정확히 이해하겠지만

추론하기로는 char* 변수는 cout-endl에서 null 문자를 메모리에서 읽을까지 값을 출력한다.

보통은 char*변수에 문자열을 담기 때문인것 같다.

덕분에 char*에 char형 데이터를 넣게되면 null 포인트를 찾지 못하고 외계어가 출력된다.

 

그렇다면 문자열 주소를 출력하려면 &dd?

 

그럼 dd 도 이미지 주소를 가리키므로 주소의 주소를 출력하게된다. 실제 dd가 가리키는 주소와 출력된 주소가 다른걸 확인할 수 있다.

 

4.

문자열 포인터값은 문자열 가장 첫인덱스 주소값을 나타낸다.

그럼 주소값++ 이런식으로 다음 인덱스에 접근해서 문자를 바꿀수 있나?

없다. 애초에 문자열은 const 따라서 포인터변수도 const 따라서 변경 불가.

 

5.

꿀팁.

디버깅 중에

위와 같이 메모리 창을 띄워놓으면

내부적으로 메모리야 어떻게 쓰이고 어떤값이 들어갔는지 확인할 수 있다!

이걸 모르고 console에 찍히는 값만 보고 추론하면 답이 없다.. ㅜ

728x90
728x90

포인터란?

메모리 주소를 가르킨다.

 

포인터변수란

메모리 주소를 갖고 있는 변수

 

포인터 변수 선언

int* pointer

int형 변수 메모리 주소를 가르킨다

ex)

int num =4;

int* pointer = #

 

&란?

변수의 주소값을 반환한다.

포인터 변수에는 주소값만 할당 가능하므로

int num =4;

int* pointer = #

와 같이 사용한다

 

*란?

&기호가 변수의 주소값을 반환한다면

반대로 *는 포인터변수가 가리키는 실제 값을 반환한다

ex)

int* pointer;

pointer // address

*pointer // value 

 

포인터 증감 +,-

int* pointer;

pointer++; ???

포인터가 가리키는 주소값의 다음 주소값을 가리킨다

주의할것은 기존에 포인터가 0을 가리킨다면 +1 증가시켰을떄

1이 아닌 4를 가리킨다.

포인터변수 타입이 int형이고 int형은 4바이트 이기 때문에 

int형의 다음 값을 가리키는 주소값은 4바이트 차이가 나는 주소값이된다.

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

c와는 달리 모든 입력이 stream 형태로 들어온다.

 

>>

출력연산자? (정식명칭)extraction 연산자? 뽑아오는 연산자?

 

C의 scanf()는 위험하다?

C의 scanf()는 경계검사를 하지 않기 때문에 위험하다.

보통 C에 입력된 데이터의 끝을 알기위해 뒤에 경계문자를 넣기 떄문에

사용자가 미리 경계의 끝을 알고 메모리를 할당하지 않으면 문제가 생긴다

 

C++의 cin은 안전한가?

C의 scanf와 마찬가지로 입력시 할당한 char[]의 길이를 알지 못하기 때문에

같은 문제가 발생한다.

 

scanf() cin 안전하게 사용하는 예

 

여러개 입력

scanf() cin 모두 공백으로 구분 가능하다

 

입력 스트림 상태

아래 그림 -표 두번째 처럼 콘솔 입력과 텍스트를 읽어와 입력처리하는 경우

다른 스트림상태가 나올수 있다.

콘솔 입력은 마지막에 엔터를 치기 떄문에...

입력버리기

cin.clear()

cin.ignore()

get()

getline()

 

 

 

 

 

728x90

+ Recent posts