';常数';C+中模板类中的方法+; 我刚刚开始阅读C++中的模板类,我遇到了一些我不知道的语法。 类方法的原型为: template <class Type> class Range { .... bool Below (const Type& value) const; .... } 模板类范围{ .... bool低于(常数类型和值)常数; .... }

';常数';C+中模板类中的方法+; 我刚刚开始阅读C++中的模板类,我遇到了一些我不知道的语法。 类方法的原型为: template <class Type> class Range { .... bool Below (const Type& value) const; .... } 模板类范围{ .... bool低于(常数类型和值)常数; .... },c++,templates,object,constants,C++,Templates,Object,Constants,定义为: template <class Type> bool Range<Type>::Below(const Type& Value) const { if (Value < Lo) return true; return false; } 模板布尔范围::以下(常量类型和值)常量{ 如果(值有一些方法可以在C++中绕过这个规则,比如“可变”关键字和conconsC铸造,但是实际上,除非你真的真的知道你在做什么,否则你不应该试图打破常

定义为:

template <class Type> bool Range<Type>::Below(const Type& Value) const {

    if (Value < Lo) return true;
    return false;
}
模板布尔范围::以下(常量类型和值)常量{
如果(值
在列出方法输入后,有人能帮助我理解“const”标志的含义吗? 我理解在输入之前放,而不是之后放的用法。 干杯
方法后的Jack

Const意味着方法本身是常量,实际上将有一个常量“this”指针。在基本术语中,它意味着不允许方法更改类的状态(成员变量)。这允许编译器根据这一事实进行优化,并告诉其他开发人员该方法不会进行状态更改


<> P>有一些方法可以在C++中绕过这个规则,比如“可变”关键字和conconsC铸造,但是实际上,除非你真的真的知道你在做什么,否则你不应该试图打破常态。

< P> >代码> const 成员函数,一个顶级的const限定符被应用到类的每个成员,除非该成员被标记为
mutable
(这意味着从不
const

您还可以拥有
volatile
成员函数以及
volatile
const

请注意,对于指针和引用,其行为可能令人惊讶:

struct X {
    int a;
    int* pa;
    int& ra;
    X() 
        : a(1)
        , pa(&a) 
        , ra(a)
    {}

    void foo() const {
        *pa = 2; // Ok, this is the pointer being const, not the value being pointed to.
        ra = 3; // Ok, this is the reference being const, not the value being referenced.
        a = 4; // Error, a is const
        pa = &a; // Error, pa is const.
    }
};
下面是如何应用顶级
const
限定符:

  • int
    变为
    int const
    ——一个常量整数
  • int*
    变为
    int*const
    -常数指针,而不是
    int-const*
    -常数指针
  • int&
    变为
    int&const
    -常数引用,而不是
    int-const&
    -常数引用。将
    const
    应用于引用没有任何作用,因为它们无论如何都不能更改为引用另一个对象

另一种思考方法是,在非常量成员函数
中,此
的类型为
X*const
,而在常量成员函数
中,此
的类型为
X const*const
。请注意,这个
指针是如何始终保持不变的。

这意味着该方法是常量。该方法无法更改所调用对象的状态。如果在此方法中更改变量,将出现编译器错误


只有声明为const的方法才能在const对象上调用,因为它们保证不会更改它。

编译器隐式地将指向该对象的指针作为非静态成员的参数传递。它在函数定义中被命名为
this
。限定符
const
表示此指针
this
具有限定符
const
。也就是说,它应用于指针
this

我不确定编译器是否允许进行优化,因为我们允许
可变的
成员。编译器将进行优化,除非使用“可变”。编译器足够聪明,可以知道类何时具有可变成员,何时不具有可变成员。相信我,编译器针对常量方法进行优化。与模板无关。在构造时,您会发现这只是成员函数的一个特性。const有时可能会令人困惑,除非您知道为什么要使用它。除了这里的好答案之外,请仔细阅读编程,这会使指针
这个
常量(即
X*const
)不是指向的值。请注意,
始终为常量,不能重新分配。我最喜欢的面试问题是
typedef char*P;类型定义常数P Q;typedef P const V
,什么是
Q
V
?@Maxim Yegorushkin也许我的描述不清楚,但我的意思是const SomeClass*。编译器在右边应用cv限定符,事实上,你说的是
SomeClass*const
。这就是为什么有些人编写
int-const
而不是混淆
const-int