-1

我是一名本科工程专业的学生,​​正在修读高级/研究生级别的 CS 模拟课程,而且我的想法有点过头了。我知道所有这些都可以通过在线搜索资源找到,但它们都是如此不连贯和肤浅的问题,事实证明很难。

我只是希望能快速回答几个问题。


我已经看到“&”使用了几种不同的方式(地址位置,并对作为局部变量传递给函数的变量进行永久更改),但我不知道它在这种情况下做了什么。事件是一个类。

bool operator>( const Event& e ) const {
            return simulation_time > e.simulation_time;
        }

输入此内容后,我意识到该运算符正在应用于指针(地址)..所以“const Event& e”似乎等同于“const Event &e”(我知道它等同于“const Event & e” )?

那是邪恶的。


下一个:在这种直截了当的情况下使用 const 有什么好处?


节目摘录:

my_heap->insert_event(event1); 

[my_heap 是一个类的实例,它包含一个基于向量的堆(和一个函数 insert_event,它将事件添加到堆中)。]

“->”是什么意思?


我见过的所有关于指针的例子都类似于

int i = 2
int *p;
p = &i;

这很好,花花公子,但我有这样的事情:

MinHeap *my_heap = new MinHeap();

我不明白它在说什么。我什至无法提出一个明智的问题。在我看来,它根本没有指向一个地址......

-------------------------------------------

提前感谢任何花时间回复的人

4

3 回答 3

3

运营商

有两个主要用途:一个是在内存中获取变量的地址,正如您似乎知道的那样。所以如果我int count = 0;的值为count0,但是这个变量在内存中的哪里?&count 将返回这个地址,它可以以多种方式使用。

另一个用途是声明/定义对类型的引用。请注意,在此上下文&中不再是运算符,并且不能在用户定义的类中赋予自定义行为。int & myRef表示对整数的引用,它非常像一个指针,但不是有一个变量来保存内存中的某个地址,而是使用一个变量作为另一个变量的一种假名。int &myRef = count;, 在此之后,count可以myRef100% 互换使用。请注意,这种用法仅在定义声明变量时出现,从不作为表达式的右侧,或在其他上下文中。正如您所指出的,对于引用,空格会被忽略,这与指针的行为相同。

常量

尽可能使用 const 总是好的行为(在我看来)。它明确了如何使用变量。想象一下,如果你有一个函数void foo(int & someIntRef)void foo(int * someIntPtr). 当我调用 foo 时,不能保证我传入的变量不会改变。也许我传入的整数是我非常密切地跟踪的东西,并且不希望其他人可能会或可能不会更改它,所以我将被迫复制它以确保 的定义foo,我可能不会甚至可以访问,也不会改变变量。在大多数情况下,如果我看到这个函数签名,我会假设该函数会改变我的变量。此外,如果编译器知道函数参数是 const,则会带来性能优势,但由于您是 c++ 新手,此时最好不要担心确切的方式/原因。

-> 运算符

这是一个运算符(注意,它可能在自定义类中被覆盖,但非常罕见)几乎总是访问指向对象的指针的数据成员或成员函数。如果我有一个结构:

struct Shape
{
    int mSideCount;
};

...

Shape SomeShape;
Shape * ptrShape = &SomeShape;

我可以访问with的mSideCount数据成员。但是ptrShape呢?它不是一个形状,它是一个指针(特别是,)。我必须首先使用运算符取消引用它,例如. 有点丑 为了让生活更轻松,存在结合取消引用和成员访问:.SomeShapeSomeShape.mSideCountShape **(*ptrShape).mSideCount->ptrShape->mSideCount

新运营商

new为对象分配内存,并确保正确构造它(为对象调用适当的构造函数,它是一个成员函数,类似于Shape(){}上面的 Shape 示例)。最大的区别在于内存的来源。当您像SomeShape上面一样创建变量时,它会在称为堆栈的内存部分中创建(因此,堆栈溢出)。堆栈通常具有相对较小的最大大小,并且一旦块(在函数括号内,循环括号内,无论块是什么)结束,堆栈上声明的任何变量都会消失,因此不能轻易在其他函数中使用。new另一方面,默认情况下使用堆上的内存创建对象,更接近于“系统上的所有内存”。有关于内存管理和体系结构的书籍,所以这是一个非常简短的介绍。

正如许多其他人所指出的 - 这些是相当基本的 c++ 概念。当您看到其他更不常见的语言功能时,您很快就会回到这里。买一本好书,通读一遍,理解它所说的一切,做一些例子,然后来这里填补你仍然无法理解的知识空白。我个人喜欢 c++ Dietle 和 Dietle,但任何事情都会对你有所帮助。

于 2012-08-31T06:26:31.587 回答
1

const Event& e和之间没有区别const Event &e。箭头运算符->是用于指针的类成员访问运算符。

于 2012-08-31T06:28:30.703 回答
0

在这种直截了当的情况下使用 const 有什么好处?

这种情况称为通过常量引用传递参数。仅按值传递参数会导致对该参数进行复制,并且该副本在函数中使用。通过常量引用传递一个对 const 函数的引用——这意味着该对象没有被复制。const 部分确保您无法修改引用参数(就像您无法更改常规常量变量一样)

MinHeap *my_heap = new MinHeap();

这是动态内存分配。new 运算符在堆上创建内存,用于放置类型的新对象MinHeap。分配空间后,new 运算符还调用该类的构造函数,并返回指向您存储my_heap在代码中的该对象的指针。然后,您可以使用运算符修改指针指向的对象->

您真的应该考虑购买有关 C++ 的介绍性文本,其中对这些内容进行了更详细的描述

于 2012-08-31T06:38:41.680 回答