代码之家  ›  专栏  ›  技术社区  ›  Schilcote

->C++中静态分配的对象上不允许使用运算符?

  •  1
  • Schilcote  · 技术社区  · 10 年前

    我是一名自学成才的程序员,第一次参加正式的大学编程课程。今天有人在C++课堂上问老师 -> 操作员会这样做。

    老师说了一句话:“除了动态分配的对象之外,箭头操作符与点操作符是等价的。您只能在静态分配的对象上使用点操作符[后面是在块的开头声明变量的示例],并且您只能在动态分配对象上使用箭头操作符 new ."

    C++绝对不是我的专业领域……但我看过的所有其他东西都说 a->b 完全等同于 *a.b ,并且它的存在主要是因为遗留的原因,因为变量在早期版本的C++中工作方式不同。

    这是真的吗 -> 不能用于指向堆栈上分配的对象的指针 . 不能用于指向堆上分配的对象的取消引用指针?

    2 回复  |  直到 10 年前
        1
  •  7
  •   IceFire    9 年前

    您的讲师的答案是错误的,它概括了一些常见的基本案例,但也表明他或她在用C++编写大型项目方面没有任何经验。原因如下:

    如果在堆栈上分配对象,即使用C++的自动内存,通常会执行以下操作:

    SomeClass object;
    object.doSomething();
    

    如果在堆上分配内存,通常如下所示:

    SomeClass* object = new SomeClass; // unique_ptrs are a better way but this might be easier to grab for now
    object->doSomething();
    delete object;
    

    但您也可以通过引用引用对象,以便 . 再次工作。你可能有一个指针指向你的 object 已在堆栈或堆上分配的,因此使用 -> 作品

    总而言之 . 用于访问非指针和 -> 用于访问指针。此外,可能有一些类 operator-> 过载。然后,您还可以使用该运算符访问类的非指针实例。

        2
  •  4
  •   Lightness Races in Orbit    10 年前

    a->b (假设没有重载改变其语义)是 (*a).b .

    怎样 *a 分配的是完全无关的。

    以下内容合法、有效且安全(如果有点愚蠢):

    std::string* str = new std::string("abc");
    std::string& ref = *str;
    
    const int n = ref.size();
    // oh no! used dot on dynamically-allocated object!
    

    老师错了。