做
const char * const getName () const
{
return name ;
}
意味着getName()
返回一个指向常量字符的常量指针?由于该函数是常量,因此它不会修改其任何参数。
做
const char * const getName () const
{
return name ;
}
意味着getName()
返回一个指向常量字符的常量指针?由于该函数是常量,因此它不会修改其任何参数。
这意味着getName()
返回一个指向常量字符的常量指针,并且它不会修改函数体内的任何非可变类成员。
请注意,声明为可变的类成员仍然可以在此函数中修改。
你的例子,
const char * const getName() const { return name; }
最有可能返回一个常量指针,该指针指向一个以空字符结尾的常量字符串(即此类字符串中的第一个字符)。从技术上讲,它只是一个指向char
. 但是这样的指针被 eg 视为指向以空字符结尾的字符串的指针cout
。
由于声明了方法,const
它不能直接修改普通的非mutable
成员,但它可以修改指针成员指向的数据。这意味着从技术上讲,它可以修改被视为调用它的对象的一部分的东西,如果这些东西被声明mutable
或被指针指向。然而,一个方法的共同约定const
是,即使它做了一些内部更改,例如更新缓存,它也不会改变对象的外部可见状态,即从外部看来,它似乎没有改变对象。
对于 C++,
优先使用字符串类,例如std::string
,特别是为了避免动态分配内存的生命周期管理问题。
不要使用get
前缀,因为在 C++ 中它们只会增加更多的阅读量(例如,你会写getSin(x)*getCos(x)
吗?)。更一般地,命名事物,使调用代码读起来像英文散文!:-) 您可以将其视为设计一种小语言。
作为一般规则,不要const
在返回值的顶层添加,因为这会阻止移动优化。
此外,通常使用成员命名约定,例如name_
(注意下划线在末尾,而不是在前面,以避免与 C 命名约定冲突)或myName
.
因此,在 C++ 中,该函数的普通函数将被编码为
string name() const { return name_; }
假设它string
在这个定义所在的非全局命名空间中不合格(这是我的偏好)。