一些C ++语法问题

时间:2012-08-31 06:19:16

标签: c++ syntax

我是一名本科工程专业的学生,​​正在攻读模拟高级/研究生水平的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();

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

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

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

3 个答案:

答案 0 :(得分:3)

&操作

有2个主要用途:一个是在内存中取一个变量的地址,就像你似乎知道的那样。所以,如果我int count = 0; count的值为0,那么这个变量在内存中的位置是多少? & count将返回此地址,这可以通过多种方式使用。

另一种用法是声明/定义对类型的引用。请注意,在此上下文中,&不再是运算符,并且不能在用户定义的类中给出自定义行为。 int & myRef表示对整数的引用,它非常类似于指针,但是您没有使用变量来保存内存中的某个地址,而是使用一个变量作为另一个变量的假名。 int &myRef = count;,在此之后,countmyRef可以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& econst Event &e之间没有区别。 箭头运算符->是用于指针的类成员访问运算符。

答案 2 :(得分:0)

  

在这样的直接使用中,使用const有什么好处   情况?

这种情况称为通过常量引用传递参数。仅按值传递参数会导致复制该参数,并且该复制在函数中使用。通过常量引用传递会传递对const函数的引用 - 这意味着不会复制该对象。 const部分确保您无法修改引用参数(与您无法更改常规常量变量的方式相同)

MinHeap *my_heap = new MinHeap();

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

你应该考虑购买关于C ++的介绍性文本,其中更详细地描述了这些内容