개발/문제풀이

Code. 프로젝트 오일러. KR 16번. C++14

ordi2017. 1. 30. 11:18

Project Euler

Problem 16

Power Digit Sum




성능 시간 : 0.806ms



댓글

개발/C++

C++. 복사 생성자와 복사 대입 연산자의 차이

ordi2016. 11. 15. 08:17

C++.

복사 생성자 (Copy Constructor) 와

복사 대입 연산자 (Copy Assignment Operator) 의

차이


참고 : Effective C++




처음에 복사 생성자와 복사 대입 연산자를 공부하고 나면, 언제 이 친구들이 호출되는지 어지러운 경우가 많습니다. 저 또한 그랬기 때문에 이 글을 작성하며 헷갈리는 점을 해소하려합니다. 그래서 다음과 같이 글을 진행하려 합니다.


1. 기본적인 호출시기

2. 함수에서 값에 의한 객체를 전달 할때는?

3. 요약

4. 소스코드





1. 기본적인 호출식


먼저 예제 클래스를 작성해 보겠습니다.



위에 코드를 참고하면, 각각의 기본 생성자, 복사 생성자, 복사 대입 연산자가 선언 되어 있습니다. 그리고 다음과 같은 메인 함수를 실행하면 어떻게 될까요.



그러면 다음과같은 출력이 완성 됩니다.


call the default constructor

call the copy constructor

call the copy constructor

call the copy assignment operator


이를 해석해 보자면,

그냥 선언을 하면 기본 생성자를,

생성시기 때 같은 타입을 인자로 넣어준다면 복사 생성자를,

생성시기 때 같은 타입을 대입 연산한다면 복사 생성자를,

그 이후 일반 상황에서 대입 연산한다면 복사 대입 연산자

사용하게 됩니다.


특히 선언시기와 동시에 대입 연산을 한다면 복사생성자를 사용한다는 점 기억해주시기 바립니다.





2. 함수에서 값에 의한 객체를 전달 할때는?


다시 말해 함수에서 객체를 Call-by-value 한다면 복사 생성자를 쓰는지, 복사 대입 연산자를 쓰는지 알아보는 실험입니다.

정답 부터 말하자면 복사 생성자를 쓰게 됩니다.


먼저 다음과 같은 함수를 작성해 보겠습니다.



이 함수를 호출 하는 메인 함수는 다음과 같습니다.




마지막 cout에서 호출이 되면 콘솔창에는 "call the copy constructor"가 출력되는 것을 볼 수 있습니다.


따라서 Call-by-value시 복사 생성자를 사용해 새로운 객체를 생성하는 것으로 생각하시면 됩니다.





3. 요약


 Test t1;        => 기본 생성자
 Test t2(t1);    => 복사 생성자
 Test t3 = t1;   => 복사 생성자
 t1 = t2;        => 복사 대입 연산자
     
 cout << isEmpty(t1) << endl;    => Call-by-Value는 복사 생성자






4. 소스코드



'개발 > C++' 카테고리의 다른 글

C++. cout 소수점 자리수 조절하기.  (0) 2016.11.08

댓글

개발/C++

C++. cout 소수점 자리수 조절하기.

ordi2016. 11. 8. 20:22

C++
cout을 이용한 출력으로 소수점 자리수 조절하기


  Power C++의 문제를 풀던 도중, PI를 출력하는 문제가 있었습니다. 그런데 이 친구가 완전히 출력이 안되었습니다. 
  완전히 출력하고 싶은 마음에 공부를 해보았습니다.


본문.

  일단 출력하고자 수를 double에 저장 했습니다. 
  4321.123456789를 저장하고 바로 출력을 해보니 4321.12가 출력 되었습니다.
  처음엔 전체 자리수가 6자리고 고정 되어있는 것을 발견하였습니다. 

  그다음 "cout << fixed;"과 "cout.precision(6);"을 입력하고 출력해보았습니다.
  그러니 4321.123457이 출력되었습니다.
  
  "cout << fixed;" 의 뜻은 소수점을 고정시켜 표현을 하겠다는 뜻입니다.
  "cout.precision(6);" 의 뜻은 6자리까지 표현을 하겠다는 뜻입니다.

  이 두 표현을 합치면, 소수점 6자리 표현하겠다는 뜻입니다.

  그러면 왜 4321.123456이 출력이 안되고 4321.123457이 되었을까?

  그 이유는 나머지 버리는 자리 수는 반올림이 되기 때문입니다.
  그래서 6째 자리까지 표현하고 7째 자리부터는 버려지기 때문에, 7째 자리인 "7"의 의미를 남기기 위해서 반올림이 되었습니다.
  고로, 4321.123457이 표현이 되었던 것입니다.

  "cout << fixed;"를 해제하시려면, "cout.unsetf(ios::fixed);"를 사용하시면됩니다.
  마찬가지로 "cout << fixed;"는 "cout.setf(ios::fixed);"로 표현이 가능합니다.

  아래에 예제 코드를 적어 놓았으니 참고 하시면 좋을 것 같습니다.



소스코드.





참고 사이트.


1) http://kcoder.tistory.com/entry/C-cout-%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%86%8C%EC%88%98%EC%A0%90-%EC%B6%9C%EB%A0%A5%EC%96%91%EC%8B%9D 2) http://moss2.tistory.com/44

2) http://moss2.tistory.com/44

'개발 > C++' 카테고리의 다른 글

C++. 복사 생성자와 복사 대입 연산자의 차이  (2) 2016.11.15

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 14번. C++

ordi2016. 10. 9. 19:26

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 13번. C++

ordi2016. 10. 9. 14:46

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 12번. C++

ordi2016. 10. 3. 20:12

소스코드가... 클래스 연습겸 만들다보니 길어졌습니다...



댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 11번. C++

ordi2016. 10. 1. 17:31

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 10번. C++

ordi2016. 10. 1. 16:41

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 9번. C++

ordi2016. 9. 28. 19:56

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 8번. C++

ordi2016. 9. 25. 15:37

댓글

Pmon

뭐든 간에 기록하자

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment

VISITED

Today :

Total :