';常数';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”标志的含义吗?
我理解在输入之前放,而不是之后放的用法。
干杯
方法后的JackConst意味着方法本身是常量,实际上将有一个常量“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
。