我是一名本科工程专业的学生,正在攻读模拟高级/研究生水平的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();
我不明白它在说什么。我甚至无法提出一个聪明的问题。在我看来它根本不是指向一个地址......
提前感谢任何花时间回复的人
答案 0 :(得分:3)
&操作强>
有2个主要用途:一个是在内存中取一个变量的地址,就像你似乎知道的那样。所以,如果我int count = 0;
count
的值为0,那么这个变量在内存中的位置是多少? & count将返回此地址,这可以通过多种方式使用。
另一种用法是声明/定义对类型的引用。请注意,在此上下文中,&
不再是运算符,并且不能在用户定义的类中给出自定义行为。 int & myRef
表示对整数的引用,它非常类似于指针,但是您没有使用变量来保存内存中的某个地址,而是使用一个变量作为另一个变量的假名。 int &myRef = count;
,在此之后,count
和myRef
可以100%互换使用。请注意,此用法仅在定义或声明变量,从不作为表达式的右侧或其他上下文时出现。如您所述,引用会忽略空格,这与指针的行为相同。
<强>常量强>
在你可以的时候(在我看来)使用const总是很好的行为。它清楚地表明了如何使用变量。想象一下,如果你有一个函数void foo(int & someIntRef)
或void foo(int * someIntPtr)
。当我调用foo时,不能保证我传入的变量不会被改变。也许我传入的整数是我正在密切关注的事情,并且不希望任何其他人可能或可能不会改变它,所以我将被迫复制它以确保foo
的定义,我甚至可能无法访问,不会改变变量。在大多数情况下,如果我看到这个函数签名,我会假设该函数会改变我的变量。此外,如果编译器知道函数参数是const,则有一个性能优势,但是因为您不熟悉c ++,所以最好不要在此时确切地关注如何/为什么。
<强> - &GT;操作强>
这是一个运算符(注意,它可能在自定义类中被覆盖,但它非常罕见)几乎总是访问指向对象的指针的数据成员或成员函数。如果我有一个结构:
struct Shape
{
int mSideCount;
};
...
Shape SomeShape;
Shape * ptrShape = &SomeShape;
我可以使用mSideCount
访问SomeShape
的{{1}}数据成员。但是ptrShape怎么样?它不是一个Shape,它是一个指针(具体来说,SomeShape.mSideCount
)。我必须首先使用Shape *
运算符取消引用它,例如*
。这有点难看。为了简化生活,(*ptrShape).mSideCount
用于组合取消引用和成员访问权限:->
。
新运营商
ptrShape->mSideCount
为对象分配内存,并确保它被正确构造(为对象调用适当的构造函数,在上面的Shape示例中,这是一个看起来像new
的成员函数)。最大的区别在于记忆的来源。当您创建上面的Shape(){}
变量时,它会在称为堆栈的内存部分中创建(因此,堆栈溢出)。堆栈通常具有相对较小的最大大小,并且一旦块(内部函数括号,循环括号,无论块是什么)结束,堆栈上声明的任何变量都会消失,因此不能轻易地在其他函数中使用。另一方面,SomeShape
默认使用堆上的内存创建对象,该内存更接近“系统上的所有内存”。有关于内存管理和架构的书籍,所以这是一个非常简短的介绍。
正如许多其他人所指出的那样 - 这些是相当基本的c ++概念。当您看到其他更不常见的语言功能时,您很快就会回到这里。得到一本好书,仔细阅读,理解它所说的一切,做一些例子,然后来这里填补你的知识空白,你仍然无法解决问题。我个人喜欢c ++ Dietle和Dietle,但任何事情都会对你有帮助。
答案 1 :(得分:1)
const Event& e
和const Event &e
之间没有区别。
箭头运算符->
是用于指针的类成员访问运算符。
答案 2 :(得分:0)
在这样的直接使用中,使用const有什么好处 情况?
这种情况称为通过常量引用传递参数。仅按值传递参数会导致复制该参数,并且该复制在函数中使用。通过常量引用传递会传递对const函数的引用 - 这意味着不会复制该对象。 const部分确保您无法修改引用参数(与您无法更改常规常量变量的方式相同)
MinHeap *my_heap = new MinHeap();
这是动态内存分配。 new运算符在堆上创建内存,用于放置类型为MinHeap
的新对象。分配空间后,new运算符还会调用该类的构造函数,并返回指向该对象的指针,该对象在代码中存储为my_heap
。然后,您可以使用->
运算符修改指针指向的对象。
你应该考虑购买关于C ++的介绍性文本,其中更详细地描述了这些内容