C++ 복습(2) - 입출력,문자열,클래스와 객체
입출력
std::cout 객체는 스크린 출력 장치에 연결된 표준 C++ 출력 스트림 객체이다. 이는 <iostream> 헤더파일 내에 선언이 되어있으며, namespace std에 선언되어있다.
« 연산자는 스트림 삽입 연산자로서, 오른쪽 피연산자를 왼쪽 스트림 객체에 삽입한다. 이 연산자는 <ostream> 클래스에 구현되어 있다.
std::cin은 표준 입력 장치인 키보드를 연결하는 C++ 입력 스트림 객체이다. cout과 마찬가지로 <iostream> 헤더파일 내에 선언되어있다.
» 연산자는 스트림 추출 연산자로, 입력 스트림에서 값을 읽어 오른쪽 변수에 저장한다.
문자열
C++의 문자열 표현 방식에는 2가지가 있다.
- C-string 방식(‘\0’으로 끝나는 문자 배열, include <cstring> or <string.h>)
- char name1[6] = {‘G’, ‘r’, ‘a’, ‘c’, ‘e’, ‘\0’}; -> name1은 문자열 “Grace”
- char name2[5] = {‘G’, ‘r’, ‘a’, ‘c’, ‘e’}; -> name2는 문자열이 아니라 단순 문자 배열
-
보다는 이 C++ 표준 방식
- string 클래스 이용(include <string>)
- C++에서 강력 추천, 표준 클래스
- 문자열의 크기에 따른 제약 없음
- C-string보다 다루기 쉬움
istream의 cin.getline()
cin.getline(char str, streamsize n);
cin.getline(char str, streamsize n, char dlim);
공백이 낀 문자열을 입력 받는 방법, delimitChar의 디폴트 값은 ‘\n’
string의 getline
getline(istream& is, string str);
getline(istream& is, string str, char dlim);
<iostream>, <fstream>, <string>에 정의
클래스와 객체
클래스 생성자
class Circle {
...
Circle();
Circle(int r);
...
}
위와 같이 한 클래스에서 여러개의 생성자를 중복해서 선언할 수 있다. 생성자를 선언하지 않는다면 기본 생성자가 자동으로 생성된다.(이는 소멸자도 마찬가지이다)
위임 생성자
- 타겟 생성자: 객체 초기화를 전담하는 생성장
- 위임 생성자: 타겟 생성자를 호출하는 생성자, 객체 초기화를 타겟 생성자에 위임
// 위임 생성자
Circle::Circle() : Circle(1) { }
// 타겟 생성자
Circle::Circle(int r){
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
또한 클래스의 멤버 변수는
- 생성자 코드에서 초기화
- 생성자 서두에서 초기값으로 초기화
- 클래스 선언부에서 직접 초기화 가 가능하다.
초기값으로 초기화 하는 예시는 아래와 같다.
// 생성자 매개변수가 없을 경우
Point::Point() : x(0), y(0){ }
// 생성자 매개변수가 있을 경우
Point::Point(int a, int b) : x(a), y(b){ }
접근 지정자
- private
- 동일한 클래스의 멤버 함수에만 제한됨
- 접근 지정자 미 정의시 디폴트값
- public
- 모든 다른 클래스에 허용
- protected
- 클래스 자신과 상속받은 자식 클래스에만 허용
인라인 함수
- inline 키워드로 선언된 함수
- 짧은 함수의 경우, 함수를 호출 및 실행하는 오버헤드가 함수를 직접 실행하는 것보다 길기 때문에, 프로그램의 실행 속도 개선을 위해 사용
- 자동 인라인 함수
- 클래스 선언부에 구현된 멤버 함수는 컴파일러에 의해 자동으로 inline처리가 된다.
- 클래스 내부의 생성자를 포함한 모든 멤버함수가 자동 인라인 함수로 쓸 수 있다.
인라인 함수 사용 예시는 아래와 같다.
#include <iostream>
inline int adder(int a, int b){
return a + b;
}
int main(void){
int num;
num = adder(3, 4);
return 0;
}
위의 경우, 앞에 inline 해준 함수를 호출하는 것이 아니라, main문의 코드로 직접 들어가는 것과 같다. 이는 컴파일 과정에서 처리되며, 따라서 짧은 길이의 함수를 반복적으로 실행해야 하는 경우 매우 효율적이다.