【问题标题】:C++ constructor with a const argument带有 const 参数的 C++ 构造函数
【发布时间】:2014-08-03 18:46:08
【问题描述】:

我只是想知道使用const char* cchar* const c 作为参数的构造函数有什么区别? 如果我在头文件和源文件中交换 char*const 不是问题,但是当我混合它们时它不会编译,说没有这样的重载构造函数。

当我将自己的类用于复制构造函数时,如果我将 MyClass const &otherconst MyClass &other 混合使用,编译器似乎不会打扰..

谁能给我指点一下? :)

【问题讨论】:

  • 问题是你没有使用std::string
  • 如果您要发布代码,您至少应该发布说明您要提出的问题的代码。

标签: c++ parameters constructor constants


【解决方案1】:

这条记录const char *c 声明了指向const char 类型对象的指针c。也就是使用这个指针你可能不会改变指针所引用的对象。

这条记录char * const c 声明了const 指针c,它指向一个char 类型的非常量对象。你不能改变指针本身,但你可以改变指针所指的对象。

声明指针和引用是有区别的。尽管使用了术语“恒定引用”,但严格来说引用本身可能不是恒定的。根据C++语法

ptr-operator:
* attribute-specifier-seqopt cv-qualifier-seq
& attribute-specifier-seqopt

引用不包含 cv-qualifier-seq。所以例如这条记录

Airplane & const other

将不正确,编译器将发出错误。 至于这些记录

const Airplane & other
Airplane const & other

那么它们与下面的recirds等价的方式相同

const char *c
char const *c

【讨论】:

  • 啊谢谢,不记得了! Visual Studio 一言不发地编译 Airplane const &other..
【解决方案2】:

* 视为“栅栏”。声明中它前面的内容定义了指针所引用的类型* 定义指针本身之后的内容。对于这种情况,最容易向后阅读(将* 翻译为“指向”),因此(从后到前)将char const *t 阅读为:“t 是指向 const char 的指针”。同样,char *const t 读作:“t 是指向 char 的 const 指针。”

  1. char *const 表示指针本身const(不能修改),但它指向的字符 可以进行修改。
  2. char const *const char * 彼此等价。两者都意味着指针本身可以修改,但它所指向的不能。

用不同的类型替换 char 并不会改变这个基本想法。

引用也是如此:const T & 表示对const T 的引用,因此您不能修改它所引用的T。在引用的情况下,您不能修改引用本身以引用不同的对象,因此T & const 没有任何实际意义(并且是不允许的)。

【讨论】:

    【解决方案3】:

    const适用于其左侧的类型(如果左侧没有任何内容,则适用于其右侧),因此const char *char const *相同,表示字符不能改变,但指针可以, 而char * const 表示字符可以改变但指针不能改变

    【讨论】:

      【解决方案4】:

      const 和 char* 的书写顺序实际上有所不同。如果您的标头中有const char*,但源文件中有char* const,您将收到错误消息,因为编译器不会将它们视为相同。

      const char* p 表示 p 指向一个不变的字符。我们可以更改 p 指向的位置,但我们永远无法更改存储在 p 处的内容。

      char* const p 表示 p 是一个常量指针,并且指向一个 char。我们可以改变存储在 p 中的内容,但我们不能改变 p 指向的位置。

      const char* const p 表示 p 是指向常量 char 的常量指针。我们不能改变 p 指向的地方,也不能改变 p 的内容。希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2014-02-03
        • 2017-08-02
        • 2020-07-13
        • 1970-01-01
        相关资源
        最近更新 更多