#include <iostream>
int main(){
std::cout<<"Hello World!"<<std::endl;
std::cout<<"Hello "<<"World!"<<std::endl;
std::cout<<"Hello World!\n";
return 0;
}
<stdio.h>
가 아니라 <iostream>
이라는 헤더파일을 추가한다.std::cout
을 이용해서 출력한다.std::endl
을 이용해서 개행한다.\n
을 이용해 개행할 수도 있다.)std::cout<<출력대상;
출력대상을 terminal에 출력
<< std::endl
을 이용해서 개행할 수 있다.endl
: endline이라는 의미입력 형식
int num;
std::cout<<"입력안내문";
std::cin>>num;
사용자로부터 입력받은 정수를 변수
num
에 저장
여러개의 입력 받기
int numA, numB;
std::cin>>numA>>num2;
사용자로부터 첫번째 입력받은 정수를 변수
numA
에 저장, 두번째 입력받은 정수를numB
에 저장
Tab
, Space
, Enter
등의 공백이 사용된다.char str[20];
std::cin>>str;
std::cout<<str<<std::endl;
사용자로부터 입력받은 문자열을 배열
str
에 저장하고, 다시 출력
💡 동일한 이름의 함수라도, 함수호출 시 전달되는 인자를 통해 함수의 구분이 가능하다.
#include <iostream>
int func(int);
int func(int, int);
int main(){
std::cout<<"1번 함수 "<<func(3)<<std::endl;
std::cout<<"2번 함수 "<<func(3, 3)<<std::endl;
return 0;
}
//아래의 두 함수는 C에서는 정의할 수 없지만, C++에서는 정의할 수 있다.
int func(int a){
return a;
}
int func(int a, int b){
return a+b;
}
int func(int a=0, int b=0){
return a+b;
}
//부분적 디폴트 값 사용
int func2(int a, int b=0)
아래와 같은 상황에서는 오류가 발생한다.
인자 1개를 전달했을 때, 내가 호출한 함수가 인자 1개의 func인지 아니면 2번째 매개변수는 디폴트 값을 사용하는 인자 2개의 func인지 구분할 수 없기 때문이다.
int func(int a){
return a;
}
int func(int a, int b=99){
return a+b;
}
//#define 패턴 변경할유형
#define SQUARE(X) ((X)*(X))
SQUARE(X)
와 동일한 패턴을 확인하면, 전처리기가 이를((X)*(X))
패턴으로 바꿔준다.
💡 매크로함수의 단점은 제거하고 장점을 유지할 수 있는 기능
inline int SQUARE(int x){
return x*x;
}
💡 특정 공간에 이름을 붙여주기위한 문법적 요소
::
연산자.std::cin
::
연산자를 이용하여 이름공간 안에서 선언된 함수를 정의할 때 사용한다.#include <iostream>
/*이름공간 생성 및 함수 선언*/
namespace Add {
int func(int, int);
}
namespace Sub {
int func(int, int);
}
int main(){
int a = 7;
int b = 2;
//함수 호출
std::cout<<Add::func(a, b)<<std::endl; //9
std::cout<<Sub::func(a, b)<<std::endl; //5
return 0;
}
/*이름공간에서 선언된 함수를 정의*/
int Add::func(int a, int b){
return a+b;
}
int Sub::func(int a, int b){
return a-b;
}
::
연산자를 이용해 구조적 순차적으로 호출하면 된다.#include <iostream>
namespace Outname {
int num = 0;
namespace Inname1 {
int num = 1;
}
namespace Inname2 {
int num = 2;
}
}
int main(){
std::cout<<Outname::num<<std::endl; //0
std::cout<<Outname::Inname1::num<<std::endl; //1
std::cout<<Outname::Inname2::num<<std::endl; //2
return 0;
}
::
을 이용한 접근과정에 별칭을 붙여준다.#include <iostream>
namespace AAA {
int num = 0;
namespace BBB {
int num = 1;
namespace CCC {
int num = 2;
}
}
}
int main(){
std::cout<<AAA::BBB::CCC::num<<std::endl; //2
//별칭 사용
namespace ABC=AAA::BBB::CCC;
std::cout<<ABC::num<<std::endl; //2
return 0;
}
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main(){
int num;
cout<<"정수를 입력하세요: ";
cin>>num;
cout<<"입력한 정수는 "<<num<<"입니다."<<endl;
return 0;
}
#include <iostream>
using namespace std;
int main(){
int num;
cout<<"정수를 입력하세요: ";
cin>>num;
cout<<"입력한 정수는 "<<num<<"입니다."<<endl;
return 0;
}
::
연산자를 붙여준다.::num
true
, false
를 정의하고 있다.#include <iostream>
using namespace std;
int main() {
cout<<"true와 false의 출력"<<endl;
cout<<"true: "<<true<<endl;
cout<<"false: "<<false<<endl;
cout<<"true와 false의 크기"<<endl;
cout<<"true: "<<sizeof(true)<<endl;
cout<<"false: "<<sizeof(false)<<endl;
return 0;
}
//선언과 대입을 따로
bool IsFirst; //초기값은 false
IsFirst = true;
//선언과 대입을 동시에
bool IsSecond = false;
💡 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름
**&
연산자의 기능**int *ptr = &num
→ 이미 선언된 변수 num의 주소값을 반환(하여 포인터 변수 ptr에 저장)int &ref = num
→ 변수 num에 대한 참조자 ref를 선언참조자는 자신이 참조하고자하는 변수와 동일한 자료형으로 선언되어야한다.
참조자의 이름앞에 & 연산자를 붙히고, 참조하고자하는 변수를 대입한다.
int num = 13;
int &ref = num;
int num = 13;
int &ref1 = num;
int &ref2 = num;
int &ref3 = num;
int num = 13;
int &ref1 = num;
int &ref2 = ref1;
int &ref3 = ref2;
→ 따라서 위의 소스코드는 하나의 변수에 대해 여러 참조자를 선언한 경우(1)와 동일하다.int &ref = 13
(X)int &ref = NULL
(X)int arr[3] = {0, 1, 2};
int &arr1 = arr[0];
int &arr2 = arr[1];
int &arr3 = arr[2];
int *ptr = new int; //6-02 참고
int &ref = *ptr;
ref = 20;
cout<<*ptr<<endl; //출력결과 : 20
*
연산자를 이용해 해당 주소(=함수 외부에 선언된 변수에 대한 공간)에 직접 접근하여 값을 바꿀 수 있다.💡 C++에서는 참조자를 이용하여 call-by-reference 함수호출을 진행할 수 있다.
#include <iostream>
using namespace std;
void SwapByRef(int &ref1, int &ref2);
int main() {
int num1 = 11;
int num2 = 10;
SwapByRef(num1, num2);
cout<<"num1: "<<num1<<endl;
cout<<"num2: "<<num2<<endl;
return 0;
}
void SwapByRef(int &ref1, int &ref2){
int temp = ref1;
ref1 = ref2;
ref2 = temp;
}
SwapByRef(num1,num2)
)이 있을 때,const
키워드를 이용하면, 이런 단점을 조금 극복할 수 있다.const
키워드를 이용한 함수 호출 단점 극복VoidSwapByRef(const int &ref1, const int &ref2)
const
키워드를 이용한 상수의 참조const int &ref = 10;
참조자를 반환할 때는 다음 세가지 경우로 나뉜다.
- 참조형으로 반환하고 참조자에 반환값을 저장하는 경우
- 참조형으로 반환하지만 일반변수에 반환값을 저장하는 경우
- 참조자를 반환하되, 반환형이 기본자료형인 경우
int &ref = Func(num);
int num2 = Func(num);
#include <iostream>
using namespace std;
int PlusOneFunc(int &ref);
int& RefPlusOneFunc(int &ref);
int main() {
cout<<"=== 참조자에 반환된 참조값을 저장하는 경우 ==="<<endl;
int num1 = 1;
int &case1 = RefPlusOneFunc(num1); //num1=2, &case1=num1
num1+=1; //num1=case1=103
case1+=100; //num1=case1=103
cout<<"num: "<<num1<<" case: "<<case1<<endl;
cout<<"=== 일반변수에 반환된 참조값을 저장하는 경우 ==="<<endl;
int num2 = 1;
int case2 = RefPlusOneFunc(num2); //num2=2, case2=2
num2+=1; //num2=3
case2+=100; //case2=102
cout<<"num: "<<num2<<" case: "<<case2<<endl;
cout<<"=== 일반변수에 반환된 값을 저장하는 경우 ==="<<endl;
int num3 = 1;
int case3 = PlusOneFunc(num3); //num3=2, case3=2
num3+=1; //num3=3
case3+=100; //case3=102
cout<<"num: "<<num3<<" case: "<<case3<<endl;
return 0;
}
/*함수 정의*/
int PlusOneFunc(int &ref){
ref++;
return ref;
}
int& RefPlusOneFunc(int &ref){
ref++;
return ref;
}
malloc()
, free()
함수를 사용한다.#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
char* MakeArr(int len);
int main() {
char* str = MakeArr(20);
strcpy(str, "Hello World!");
cout<<str<<endl;
free(str);
return 0;
}
char* MakeArr(int len){
char* str = (char*)malloc(sizeof(char)*len);
return str;
}
(char*)
new
int* ptr1 = new int;
double* arr1 = new double[7];
delete
delete ptr1;
delete []arr1;
#include <iostream>
#include <string.h>
using namespace std;
char* MakeArr(int len);
int main() {
char* str = MakeArr(20);
strcpy(str, "Hello World!");
cout<<str<<endl;
delete []str;
return 0;
}
char* MakeArr(int len){
char* str = new char[len];
return str;
}
#include <stdio.h>
→ #include <cstdio>
#include <stdlib.h>
→ #include<cstdlib>
#include <math.h>
→ #include<cmath>
#include <string.h>
→ #include<cstring>
본문은 ⟪열혈 C++ 프로그래밍, 윤성우⟫ 도서에 기반하여 정리한 내용입니다.