본문 바로가기

전체 글51

Why doesn't my constructor work right? 왜 제 생성자가 제대로 동작하지 않죠? 이 질문은 다음과 같은 많은 질문에서 뽑혔습니다 :- 왜 컴파일러가 제가 원하지도 않을때 제 객체를 복사하나요?- 어떻게 복사를 막을 수 있나요?- 어떻게 암묵적 변환을 막을 수 있나요?- 어떻게 제 int 값을 복소수 값으로 바꾸나요? 기본적으로 클래스는 모든 요소를 복사하는 복사 생성자와 복사 할당을 제공합니다.예시: struct Point {int x,y;Point(int xx = 0, int yy = 0) :x(xx), y(yy) { }}; Point p1(1,2);Point p2 = p1; 여기에 p2.x==p1.x and p2.y==p1.y 부분이 있습니다. 이런게 종종 정확히 여러분들이 원하던 것이겠지만 (그리고 C의 호환성을 위해 필수인 것), 다음도.. 2019. 1. 15.
Does "friend" violate encapsulation? "friend"가 캡슐화를 망치나요? 그렇지 않습니다. friend는 회원권 처럼 접근권한을 얻는 명시적인 메커니즘입니다. 소스를 수정없이 스스로 클래스의 접근 권한을 얻을 수 없습니다. 예를 들자면 : class X {int i;public:void m();// grant X::m() accessfriend void f(X&);// grant f(X&) access// ...}; void X::m() { i++; /* X::m() can access X::i */ } void f(X& x) { x.i++; /* f(X&) can access X::i */ }c++의 보호 모델의 설명은 D&E sec 2.10, TC++PL sec 11.5, 15.3, C.11을 참고하세요 원문 Does "friend" .. 2018. 12. 19.
Why isn't the destructor called at the end of scope? 간단하게 말하자면 "당연합니다." 이지만, 이 질문에서 자주 나오는 예시들을 보세요. void f(){X* p = new X;// use p} 즉, new를 통해 생성된 객체가 함수의 끝에서 파괴 될 것이라는 틀린 가정이었습니다. 기본적으로, 객체를 생성한 스코프의 수명이 지나서 살아야 하는 경우에만 new를 사용해야합니다. 이것이 끝나게 된다면, delete로 파괴해야 합니다. 예를 들자면 : X* g(int i) { /* ... */ return new X(i); }// the X outlives the call of g() void h(int i){X* p = g(i);// ...delete p;} 만약 스코프에서만 오브젝트가 살아있게 하고싶다면, new를 사용하지 말고 단단하게 변수만 정의하세요:.. 2018. 8. 13.
How do i define an in class constant? 본문 내부 클래스 상수는 어떻게 정의하나요 상수 표현식에서 사용할 수 있는 상수, 예를들자면 배열 범위를 원한다면, 2가지 선택지가 있습니다. class X {static const int c1 = 7;enum { c2 = 19 }; char v1[c1];char v2[c2]; // ...}; 얼핏 보기에는, c1의 선언이 깔끔해보이겠지만, 내부 클래서 초기화 문법에서 사용하기 위해서는 상수가 정수형 static const 거나, 상수 표현식으로 초기화된 열거형이어야만 합니다. 이 방법들은 아주 제한적입니다. class Y {const int c3 = 7;// error: static 아님static int c4 = 7;// error: const 아님static const float c5 = 7;// .. 2018. 8. 12.