因为这是我写的一道期中考试题,我不理解答案,所以被标记为作业。我被要求解释以下语句中每个const的目的:
const char const * const GetName() const { return m_name; };
那么,每个常量的解释是什么呢?
因为这是我写的一道期中考试题,我不理解答案,所以被标记为作业。我被要求解释以下语句中每个const的目的:
const char const * const GetName() const { return m_name; };
const char const *const
这是一个指向常量的指针 ... 现在我们来看情况失控!你有一个额外的 const
-- 这是一个语法错误。下列两种写法是等价的:const T
和 T const
。如果你去掉其中一个 const
,你会得到一个指向常量字符的常量指针。这样说清楚了吗?
const int const one = 1;
也可以) - configurator您的代码中有一个超出语法限制的const,该代码无法编译。请将“char”和“*”之间的“const”删除。此外,最后一个const必须位于函数体之前。从右到左阅读这样的内容会更有帮助。
const char * const GetName() const { return m_name; };
你有一个const函数(即该函数不会改变类的状态),它返回一个指向const char的const指针。
(1) const char数组的内容是不可更改的。当您返回对象成员的指针时,这非常有用。由于您将指向成员的指针交给第三方,因此希望防止它从外部被更改。
(2) 这种形式不经常使用,本质上与(1)相同。
(3) 我们的char数组指针是const的,因此您无法更改指针指向的位置。
(4) 它限定了GetName()方法本身,意味着该方法不会更改应用它的类。因此,它只能为此类型的const对象调用。通常使用的形式是GetName(...) const。
正如在其他答案中已经提到的,"记住"它的诀窍是从右到左阅读:
const T
和T const
是相同的。另一方面,T const *
和T * const
是不同的,一个标记T为常量,另一个标记指针为常量。 - David Rodríguez - dribeas编辑:看起来我在将代码粘贴到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;
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,上面的代码将会失败。
你可能在第二个const关键字前漏掉了“*”符号。
const char * const * const GetName() const { return m_name; };
这意味着该函数返回指向常量字符的常量指针的常量指针。
最后一个 const:
最后一个 const 后面:
第二个 const:
第一个:
所以完整的意思是:该函数返回一个常量指针(始终指向同一位置),指向一个常量 char(始终具有相同的内容),并且该函数不修改类的状态。
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
给定:
const char const * const GetName() const { return m_name; };
第一个和第二个const是等价的,但只允许其中一个--即你可以在类型(在这种情况下为char)之前或之后放置const,但只能选择其中一个,而不能两者都有。无论哪种方式,都表示指针所指向的字符不能被写入。
在'*'后面的const意味着函数返回的指针本身不能被修改。这在返回类型中很少见--你返回的是一个值,在任何情况下都不能被修改(通常只是分配给某个变量)。然而,在其他情况下,这可能是有意义的。
第三个const
只允许在一个成员函数中使用。它表示当调用此函数时,接收到的this
指针将是T const * const
而不是T * const
,因此成员函数只能修改对象的static
或mutable
成员,并且如果调用其他成员函数,它们也必须是const
。然而,有一个警告,它也可以去除const
属性,这样它就可以修改所需的内容(但需要注意的是,如果对象最初被定义为const
,而不仅仅是具有指向普通(非const
)对象的const
指针,则结果将是未定义的)。
class X { const char * const getName() const { return m_name; } ...
- David Rodríguez - dribeasconst char const
中的双重const是有效的,但在C++中不是。只允许一个const,但删除哪个并不重要。 - Johannes Schaub - litb