Advertisement
dooly386

C++ class의 궁금증 정리 1

May 14th, 2019
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. C++ class의 궁금증 정리 1
  2.  
  3. 일단 다음의 class를 준비
  4.  
  5. int idx = 0;
  6. class C
  7. {
  8. public:
  9.     bool b;
  10.     C() : b(false)
  11.     {
  12.         cprintf("C() b=%s,idx=%d",b ? "true" : "false",++idx);
  13.     }
  14.  
  15.     C(bool _v) : b(_v)
  16.     {
  17.         cprintf("C(bool _v) b=%s,idx=%d",b ? "true" : "false",++idx);
  18.     }
  19.  
  20.     bool Get() const
  21.     {
  22.         cprintf("Get b=%s,idx=%d",b ? "true" : "false",++idx);
  23.         return b;
  24.     }
  25.  
  26. };
  27.  
  28.  
  29.  
  30. 만약 다음과 같다면  호출되는 순서는
  31.  
  32. C a(true),b(false);
  33.  
  34. 결과 는 당연히 앞에것부터.
  35.  
  36. C(bool _v) b=true,idx=1
  37. C(bool _v) b=false,idx=2
  38.  
  39.  
  40.     C a[] = {false,true,true};
  41.  
  42. 위와 같은경우는??
  43.  
  44. C(bool _v) b=false,idx=1
  45. C(bool _v) b=true,idx=2
  46. C(bool _v) b=true,idx=3
  47.  
  48. { } 의 앞에것이 인덱스 0 이고 뒤로 하나씩 증가…
  49.  
  50.  
  51. 이중 궁금한게 있었다.
  52.  
  53. c++ 11 부터(???) 사용할 수 있는  for iterator….
  54.  
  55.  
  56.  
  57.     C a[] = {false,true,true};
  58.  
  59.     for(auto v : a)
  60.     {
  61.         v.Get();
  62.     }
  63.  
  64.  
  65.     C a[] = {false,true,true};
  66.  
  67.     for(auto &v : a)
  68.     {
  69.         v.Get();
  70.     }
  71.  
  72. 이것..
  73.  
  74. auto v 가 과연 auto v 와 auto &v 가 차이가 있을까???
  75.  
  76. 결과적으로 차이가 없다.
  77.  
  78.  
  79. C(bool _v) b=false,idx=1
  80. C(bool _v) b=true,idx=2
  81. C(bool _v) b=true,idx=3       << 여기까지 C a[] ….
  82. Get b=false,idx=4
  83. Get b=true,idx=5
  84. Get b=true,idx=6    << 여기까지 for(auto v: a)            
  85. Get b=false,idx=7  
  86. Get b=true,idx=8
  87. Get b=true,idx=9   << 여기까지 for(auto &v: a)
  88.  
  89.  
  90. auto v : a 는    auto v = a[i] ; 아닌가???
  91.  
  92.  
  93. 그래서 다음을 테스트
  94.  
  95.     C a[] = {false,true,true};
  96.     for(int i=0;i<sizeof(a);i++)
  97.     {
  98.         C v = a[i];
  99.         v.Get();
  100.     }
  101.  
  102.  
  103. C(bool _v) b=false,idx=1
  104. C(bool _v) b=true,idx=2
  105. C(bool _v) b=true,idx=3
  106. Get b=false,idx=4
  107. Get b=true,idx=5
  108. Get b=true,idx=6
  109.  
  110. 음.. C v = a[i] 에서 자기복제 생성자가 호출이 안되는군요….
  111.  
  112. C v=a[i] 나 C &v=a[i] 나 상관 없다는 뜻..
  113.  
  114. 그러나…. 여기서 다시 궁금증 발동.. 값을 변경하는 write access를 수행해도???
  115.  
  116.     C a[] = {false,true,true};
  117.  
  118.  
  119.     for(auto &v : a)
  120.     {
  121.         v.Get();
  122.         v.b = false;
  123.     }
  124.  
  125.     for(auto v : a)
  126.     {
  127.         v.Get();
  128.         v.b = false;
  129.     }
  130.  
  131.  
  132.  
  133. C(bool _v) b=false,idx=1
  134. C(bool _v) b=true,idx=2
  135. C(bool _v) b=true,idx=3
  136. Get b=false,idx=4
  137. Get b=true,idx=5
  138. Get b=true,idx=6
  139. Get b=false,idx=7
  140. Get b=false,idx=8
  141. Get b=false,idx=9
  142.  
  143. 결과는…. 컴파일러가 너무 똑똑한듯…
  144.  
  145. 주소를 직접 찍어보자..
  146.  
  147.  
  148.     C a[] = {false,true,true};
  149.  
  150.  
  151.     for(auto &v : a)
  152.     {
  153.         cprintf("%d",(uint64_t)&v);
  154.     }
  155.  
  156.     for(auto v : a)
  157.     {
  158.         cprintf("%d",(uint64_t)&v);
  159.     }
  160.  
  161.  
  162. C(bool _v) b=false,idx=1
  163. C(bool _v) b=true,idx=2
  164. C(bool _v) b=true,idx=3
  165. 1370776
  166. 1370777
  167. 1370778
  168. 1370712
  169. 1370712
  170. 1370712
  171.  
  172.  
  173. 음… 분명 다른 주소.. 심지어 auto v: a 는  v의 위치가 한곳으로 고정…
  174. auto v : a 는 a 값이 그냥 dump 로 v 에 복제되는것이 분명하다.
  175.  
  176.  
  177. 그렇다면……. ?????
  178.  
  179. 다음회에 계속………
  180.  
  181. [( ̄. ̄)]zZ
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement