이런 것의 차이점은 무엇입니까
friend Circle copy(const Circle &);
그리고 이것과 같은
friend Circle copy(Circle&) const;
이 함수가 호출 된 개체를 변경하지 않을 것임을 컴파일러에 알리기 위해 함수가 사용 된 후 const를 알고 있습니다. 다른 함수는 어떻습니까?
답변:
첫 번째 형식은 함수 Circle
의 매개 변수 인 참조에 바인딩 된 객체의 상태 가 해당 참조를 통해 copy()
변경되지 않음 copy()
을 의미합니다. 참조는에 대한 참조 const
이므로 Circle
자체적으로로 한정되지 않은 참조를 통해의 멤버 함수를 호출 할 수 없습니다 const
.
반면에 두 번째 형식은 불법입니다. 멤버 함수 만 const
정규화 될 수 있습니다 (글로벌 friend
함수 가 있다고 선언하는 동안 ).
const
멤버 함수를 한정 할 때 한정은 암시 적 this
인수를 참조합니다 . 즉, 해당 함수는 호출 된 객체 (암시 적 this
포인터가 가리키는 객체)의 상태를 변경할 수 없습니다.mutable
없지만 이는 또 다른 이야기입니다.
코드로 말하려면 :
struct X
{
void foo() const // <== The implicit "this" pointer is const-qualified!
{
_x = 42; // ERROR! The "this" pointer is implicitly const
_y = 42; // OK (_y is mutable)
}
void bar(X& obj) const // <== The implicit "this" pointer is const-qualified!
{
obj._x = 42; // OK! obj is a reference to non-const
_x = 42; // ERROR! The "this" pointer is implicitly const
}
void bar(X const& obj) // <== The implicit "this" pointer is NOT const-qualified!
{
obj._x = 42; // ERROR! obj is a reference to const
obj._y = 42; // OK! obj is a reference to const, but _y is mutable
_x = 42; // OK! The "this" pointer is implicitly non-const
}
int _x;
mutable int _y;
};
const
객체 obj
클래스를 X
, 내가 전화 bar()
처럼 obj.bar(obj)
왜 일어날하도록되어 무엇? 호출자에서 선언되었으므로 obj._x = 42
실패 하지 않아야 합니까? obj
const
void bar(X const& obj) {...}
)를 이렇게 만드는 경우는 어떻습니까? void bar(const X& obj) {...}
, const
키워드를이 위치로 이동하면 변경되는 사항이 있습니까? 그렇다면이 예제도 추가해 주시겠습니까?
const
왼쪽에있는 것 또는 왼쪽에 아무것도없는 경우 오른쪽에있는 것에 적용됩니다. 귀하의 경우 두 버전 모두 const
에 적용되는 것을 볼 수 X
있습니다.
C ++ 클래스 메서드에는 this
모든 명시 적 매개 변수 앞에 오는 암시 적 매개 변수가 있습니다. 따라서 다음과 같은 클래스 내에서 선언 된 함수 :
class C {
void f(int x);
실제로 다음과 같은 모습을 상상할 수 있습니다.
void f(C* this, int x);
이제 다음과 같이 선언하면 :
void f(int x) const;
마치 당신이 이것을 쓴 것처럼 :
void f(const C* this, int x);
즉, 후행 const
은 this
매개 변수를 const로 만듭니다. 즉, 클래스 유형의 const 개체에서 메서드를 호출 할 수 있으며 메서드가 호출 된 개체를 수정할 수 없습니다 (적어도 일반 채널을 통하지 않음).
friend
OP의 실제 질문 (또는 모든 문제가 밝혀지면 실제 질문이 어떻게 될지)과는 무관하다고 생각하기 때문에 부분 을 무시하기로 결정했습니다 . 그러면 그렇게 해.
Circle copy(Circle&) const;
기능 const
자체를 만듭니다 . 이것은 클래스 / 구조체의 멤버 함수에만 사용할 수 있습니다.
멤버 함수를 만드는 const
것은
const
객체에 의해 호출 될 수 있습니다 ( const
객체는 const
함수 만 호출 할 수 있음 ). 상수가 아닌 객체는 const
함수를 호출 할 수도 있습니다.이제 다음을 고려하십시오.
Circle copy(const Circle &);
이것은 전달 된 매개 변수가 함수 내에서 변경 될 수 없음을 의미합니다. 클래스의 멤버 함수일 수도 있고 아닐 수도 있습니다.
참고 :const
동일한 함수의 상수가 아닌 버전을 가지도록 함수를 오버로드 할 수 있습니다.
다음과 관련된 모든 혼동을 제거합시다. const
const
상수 에서 온 것은 무언가가 변경 불가능하지만 읽을 수 있음을 의미합니다.
const
키워드로 변수를 한정 하면 나중에 변경할 수 없습니다.
예를 들어 const 변수는 선언 될 때 초기화되어야합니다.
const
int var =25;
var =50; // gives error
우리가 우리의 포인터 변수를받을 자격이 있는지 후 우리는 할 수없는 포인터 자체를 변경하지만 포인터의 내용은 변경 .
예
//하지만const
*
int *
const
ptr = new int;
ptr = new int; //gives error
*ptr=5445; //allowed
우리가 우리의 포인터 변수를받을 자격이 있는지 전에 우리는 수 자체가 포인터를 변경할 수 있지만, 포인터의 내용은 변경할 수 없습니다 .
예
//하지만const
*
int
const
* ptr = new int(85);
//or
const
int * ptr = new int(85);
ptr = new int; // allowed
*ptr=5445; // gives error
포인터와 내용 모두 상수
예
int
const
*
const
ptr = new int(85);
//or
const
int *
const
ptr = new int(85);
ptr = new int; // not allowed
*ptr=5445; // not allowed
Circle copy(const Circle &);
friend Circle copy(Circle&) const;
class A{ public :
int var;
void fun1()
{ var = 50; // allowed
}
void fun2()const
{ var=50; //not allowed
}
};
하나는 매개 변수를, 다른 하나는 함수를 나타냅니다.
Circle copy(const Circle &);
이것은 전달 된 매개 변수가 함수 내에서 변경 될 수 없음을 의미합니다.
Circle copy(Circle&) const;
const
자격을 갖춘 기능은 멤버 함수 및 개체 자체의 데이터 멤버를 변경할 수 없습니다 수단에 사용됩니다. 귀하가 게시 한 예는 말도 안됩니다.
첫 번째 함수를 Circle copy(Circle const&);
같은 의미 로 다시 작성하면 오른쪽에서 왼쪽으로 읽는 것이 유용하다는 것이 분명해집니다. 객체에 copy
대한 const
참조를 가져와 참조로 Circle
객체를 반환 하는 함수입니다 Circle
.
friend Circle copy(const Circle &);
// 함수의 상수 매개 변수를 나타냅니다. 매개 변수에 저장된 값을 변경할 수 없습니다.
예제에서 친구를 제거해야합니다. Circle copy (Circle &) const; // 상수 멤버 함수로 명명 된이 값을 변경할 수 없습니다.