【问题标题】:The * in C++ Initialisations [duplicate]C ++初始化中的* [重复]
【发布时间】:2012-10-06 14:15:22
【问题描述】:

可能重复:
The Definitive C++ Book Guide and List

我是 C++ 新手,一直在玩一些示例,我只是想知道初始化类时 * 是什么意思。

通常在 AS3 中我会这样做:

MyClass myClass = new MyClass

但是我在 c++ 中看到过这个

 MyClass *myClass = new MyClass

星星是干什么用的,我见过它有时用过,但其他人用过。

谢谢!

【问题讨论】:

  • 查找指针。尽量不要动态分配内存,或者至少使用向量/智能指针。
  • 这是基础知识,见The Definitive C++ Book Guide and List
  • 为什么有这么多反对票?他不可能用谷歌搜索它,你不能用谷歌搜索 *,他需要已经知道它是一个指针才能用谷歌搜索它。
  • @satuon 我没有投反对票,但如果他甚至不知道 C++ 中的 * 是什么,他应该在提问之前拿起一本教科书。

标签: c++


【解决方案1】:

C++ 中的星号有很多含义,具体取决于它在程序中的位置。在这个特定的实例中,它将myClass 的含义修改为一个指针,指向MyClass 的实例,而不是MyClass 的实例。

两者的区别在于,实例的生命周期在超出范围时结束,而您通过指针分配和引用的实例即使在指针超出范围后仍然有效。

这样的声明是有效的:

MyClass myClass; // no "new"

在这种情况下,不必使用new,但实例的生命周期与变量myClass 的范围相关。

【讨论】:

  • 所以我需要先初始化我的类,然后当我稍后引用它时使用*myClass?
  • @user1013512 在 C++ 中,就处理类而言,您有多种选择。您可以使用new 动态分配实例;在这种情况下,星号是必需的,然后使用 -> 运算符而不是点 . 来访问类的成员。完成对象后,您还必须调用delete myClass。您也可以完全跳过new 并使用点.,但是一旦其变量超出范围,该对象就会被删除。
【解决方案2】:

它被称为指针。如果您使用的是与 C++11 兼容的编译器,则可以执行以下操作:

auto myClass = std::make_shared<MyClass>();

如果您使用的是“原始”指针,则需要在使用完内存后手动删除它,使用 shared_ptr,这不是必需的。

【讨论】:

    【解决方案3】:

    星号代表pointer。指针是一个内存地址。当您编写 MyClass *myClass 时,您创建了一个指向创建新 MyClass 的位范围开头的指针。

    使用new 创建一个对象,您将负责它的生命周期。当您不再需要它们时,您需要将其删除,而创建 MyClass myClass; 将在退出创建它的范围时被销毁。即使以这种方式编写,您仍然可以使用 & 运算符访问 myClass 内存地址。

    如果您需要更多解释,请尝试获取those books 之一。

    【讨论】:

    • 它通常被称为“星号”而不是“星号”。
    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多