Const正确性:const char const * const GetName const(// stuff);

时间:2009-12-02 19:58:25

标签: c++ const-correctness

标记为作业,因为这是一个关于中期的问题,我写道,我不明白答案。我被要求在下面的陈述中解释每个const的目的:

const char const * const GetName() const { return m_name; };

那么,对于每个这些问题的解释是什么?

8 个答案:

答案 0 :(得分:6)

从右边拿走它们。 ;之前的那个告诉客户端这是一个设计级别const,即它不会改变对象的状态。 (将此视为只读方法。)

好的,现在返回值:

const char const *const

这是一个指向好的指针......在这里我们一动不动!您有一个额外的const - 语法错误。以下是等效的:const TT 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;

  1. char数组的内容是const。返回对象成员的指针时,这很好。由于您为第三方提供了指向您的成员的指针,因此您希望阻止它从外部更改。
  2. 此表格不经常使用,与(1)
  3. 基本相同
  4. 我们指向char数组的指针是const,所以你不能改变指针指向的位置。
  5. 它限定了GetName()intself,这意味着该方法因此也不会改变它所应用的类。因此,只能为此类型的const对象调用它。 此表单通常用作GetName(...)const。
  6. 正如在另一个回答中已经提到的那样,“记住”它从右到左阅读的技巧:

    • const T * - 指向const T的指针
    • T * const - const指向T
    • 的指针

答案 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:

  • 该函数返回一个const char(即char的内容是常量)

首先:

  • 不知道?

所以要完成: 该函数将常量指针(始终相同的位置)返回到常量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指向普通(非常量)对象的指针,结果将是未定义的。)