标记为作业,因为这是一个关于中期的问题,我写道,我不明白答案。我被要求在下面的陈述中解释每个const的目的:
const char const * const GetName() const { return m_name; };
那么,对于每个这些问题的解释是什么?
答案 0 :(得分:6)
从右边拿走它们。 ;
之前的那个告诉客户端这是一个设计级别const,即它不会改变对象的状态。 (将此视为只读方法。)
好的,现在返回值:
const char const *const
这是一个指向好的指针......在这里我们一动不动!您有一个额外的const
- 语法错误。以下是等效的:const T
或T const
。如果你取出const
,你会得到一个指向常数字符的常量指针。这有帮助吗?
答案 1 :(得分:2)
你还有一个const,而不是语法允许的,代码不会编译。删除“char”之后和“*”之前的“const”。此外,最后一个const必须在函数体之前。它有助于从右到左阅读这样的内容。
const char * const GetName() const { return m_name; };
你有一个const函数(即函数不会改变类的状态。),它返回一个指向const char的const指针。
答案 2 :(得分:2)
(1)const char(2)const *(3)const GetName(){return m_name; }(4)const;
正如在另一个回答中已经提到的那样,“记住”它从右到左阅读的技巧:
答案 3 :(得分:1)
编辑:看起来我错误地将代码粘贴到了Comeau中,或者在原始答案中对其进行了编辑是正确的。在任何一种情况下,我都保留下面的答案,好像代码不正确。
Comeau在线编译器给出了以下结果:
“ComeauTest.c”,第4行:错误:输入 限定符指定不止一次
const char const * const GetName(){ return m_name; } const; ^“ComeauTest.c”,第4行:警告:输入 返回类型的限定符是 无意义的const char const * const GetName(){return m_name; } const; ^
“ComeauTest.c”,第4行:错误: 声明没有声明任何内容 const char const * const GetName(){ return m_name; } const;
这意味着您的陈述格式不正确。
const char const * const GetName() { return m_name; } const;
第一和第二个意思是同样的事情。您不能多次指定相同的限定符,因此必须删除其中一个以便编译代码。这两个consts都指定GetName返回的指针指向的值无法修改,使得这样的代码无效:
const char* name = c.GetName();
name[0] = 'a';
第三个const指定GetName()返回的指针本身不能修改,但正如Comeau指出的那样,这对返回值没有任何作用,因为返回值是指针的副本而不是指针的副本本身,可以分配给非const指针。
第四个const是错位的,它应该在GetName和函数体之间,如下所示:
const char* GetName() const { return m.name; }
此const指定在执行GetName期间不会修改类的任何成员。假设GetName是Person类的成员,则允许使用以下代码:
const Person& p;
p.GetName();
如果没有这个const,上面的代码就会失败。
答案 4 :(得分:1)
您可能在第二个const关键字之前错过了“*”符号。
const char * const * const GetName() const { return m_name; };
所以这意味着该函数返回指向常量字符的常量指针的常量指针。
答案 5 :(得分:0)
最后一个const:
一个又一个const:
第二个const:
首先:
所以要完成: 该函数将常量指针(始终相同的位置)返回到常量char(始终相同的内容),并且该函数不会修改类的状态。
答案 6 :(得分:0)
const(1)char const(2)* const GetName(){return m_name; } const(3);
const char * const result = aaa.GetNAme();
3 - const方法,不允许更改成员或调用任何非const方法。
1 - 不允许在指针内修改,即* result = ..
2 - 不允许移动指针,即result = NULL
答案 7 :(得分:0)
假设:
const char const * const GetName() const { return m_name; };
第一个和第二个const是等价的,但只允许其中一个 - 即你可以在类型之前或之后放置const
(在这种情况下为char
)但只有一个或另一个, 不是都。但是,要么指出指针指向的字符不能写入。
'*'后面的const
表示函数返回的指针本身不能被修改。这在返回类型中很少出现 - 您返回的是一个值,在任何情况下都无法修改(通常只分配给某个变量)。然而,这在其他情况下可能是有意义的。
第三个const
仅允许在成员功能上使用。它说当调用此函数时,收到的this
指针将是T const * const
而不是T * const
,因此成员函数只能修改static
或{{ 1}}对象的成员,如果它调用其他成员函数,它们也必须是mutable
。然而,有一个警告,它也可以抛弃常量,在这种情况下,它可以修改它认为合适的东西(进一步警告,如果对象最初定义为const
,而不是只有const
指向普通(非常量)对象的指针,结果将是未定义的。)