const
이와 같은 선언 에서 의미는 무엇입니까 ? 은 const
나를 혼란.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
답변
const
키워드를 메소드에 추가하면 this
포인터는 기본적으로 const
객체에 대한 포인터가 되므로 멤버 데이터를 변경할 수 없습니다. (를 사용하지 않으면 mutable
나중에 자세히 설명).
const
키워드는 두 개의 유사한 방법, 객체 인 경우라고 하나 구현할 수 있다는 것을 의미 기능 서명의 일부 const
, 그리고 하나를.
#include <iostream>
class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Foo() const
{
std::cout << "Foo const" << std::endl;
}
};
int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
}
출력됩니다
Foo
Foo const
비 const 메소드에서는 const
버전 에서 할 수없는 인스턴스 멤버를 변경할 수 있습니다 . 위의 예제에서 메소드 선언을 아래 코드로 변경하면 약간의 오류가 발생합니다.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
멤버를 표시 할 수 mutable
있고 const
메서드를 변경할 수 있기 때문에 이는 사실이 아닙니다 . 내부 카운터 및 물건에 주로 사용됩니다. 그 해결책은 아래 코드입니다.
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; // This works because counter is `mutable`
std::cout << "Foo const" << std::endl;
}
int GetInvocations() const
{
return counter;
}
};
int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
}
어떤 출력
Foo
Foo const
Foo has been invoked 2 times
답변
const는 메소드가 클래스의 멤버를 변경하지 않을 것을 약속합니다. 객체 자체가 표시된 경우에도 그렇게 표시된 객체의 멤버를 실행할 수 있습니다 const
.
const foobar fb;
fb.foo();
합법적 일 것입니다.
참조 얼마나 많은 및 C에서 “CONST”++의 사용은 있습니까? 자세한 내용은.
답변
const
규정 수단이 방법은 임의의 값으로 호출 될 수있다 foobar
. const 객체에서 비 const 메소드를 호출 할 때 차이점이 있습니다. foobar
유형에 다음과 같은 추가 메소드 선언이 있는지 고려하십시오 .
class foobar {
...
const char* bar();
}
이 방법 bar()
은 상수가 아니며 상수가 아닌 값에서만 액세스 할 수 있습니다.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
그러나 아이디어 const
는 클래스의 내부 상태를 변경하지 않는 메소드를 표시하는 것입니다. 이것은 강력한 개념이지만 실제로 C ++에서는 적용 할 수 없습니다. 그것은 보증보다 더 약속입니다. 그리고 종종 부서지고 쉽게 부서지는 것.
foobar& fbNonConst = const_cast<foobar&>(fb1);
답변
이러한 const는 ‘with const’메소드가 내부 데이터를 변경하면 컴파일러가 오류를 발생시킵니다.
class A
{
public:
A():member_()
{
}
int hashGetter() const
{
state_ = 1;
return member_;
}
int goodGetter() const
{
return member_;
}
int getter() const
{
//member_ = 2; // error
return member_;
}
int badGetter()
{
return member_;
}
private:
mutable int state_;
int member_;
};
시험
int main()
{
const A a1;
a1.badGetter(); // doesn't work
a1.goodGetter(); // works
a1.hashGetter(); // works
A a2;
a2.badGetter(); // works
a2.goodGetter(); // works
a2.hashGetter(); // works
}
자세한 내용은 이것을 읽으십시오
답변
블레어의 대답은 표에있다.
그러나 mutable
클래스의 데이터 멤버에 추가 될 수 있는 한정자가 있습니다. 이렇게 표시된 모든 구성원 은 계약 을 위반하지 않고 방법 으로 수정할 수 있습니다 .const
const
객체가 해당 메소드의 “논리적”제한에 영향을 미치지 않으면 서 특정 메소드가 몇 번이나 호출되는지 기억하도록하려는 경우이를 사용할 수 있습니다 (예 :).
답변
C ++ 에서 Const 멤버 함수의 의미 상식 : 필수 중급 프로그래밍 은 다음과 같은 명확한 설명을 제공합니다.
X 클래스의 비 const 멤버 함수에서 this 포인터의 유형은 X * const입니다. 즉, 상수가 아닌 X에 대한 상수 포인터입니다 (const 포인터 및 Const에 대한 포인터 [7, 21] 참조). 이것이 참조하는 객체는 const가 아니기 때문에 수정할 수 있습니다. 클래스 X의 const 멤버 함수에서이 유형은 const X * const입니다. 즉, 상수 X에 대한 상수 포인터입니다.이 개체가 참조하는 개체가 const이므로 수정할 수 없습니다. const와 non-const 멤버 함수의 차이점입니다.
따라서 코드에서 :
class foobar
{
public:
operator int () const;
const char* foo() const;
};
다음과 같이 생각할 수 있습니다.
class foobar
{
public:
operator int (const foobar * const this) const;
const char* foo(const foobar * const this) const;
};
답변
const
메소드 서명에 사용하면 (당신의 const char* foo() const;
말 🙂 컴파일러 this
가이 메소드 ( foo
여기있는)로 메모리를 변경할 수 없다고 말하고 있습니다 .