关于c ++的2个初学者问题

时间:2012-02-25 16:45:26

标签: c++ c header

1.使用什么 - >例如test-> name与test.name?

相同

2.头文件用于什么?我习惯了其他编程语言,比如java,你只需要1个文件(类文件)。我们是否需要使用头文件来声明所有内容?

7 个答案:

答案 0 :(得分:4)

    a->b是指针时,
  1. (*a).ba相同。对于同样的事情,它只是方便的语法。当a是一个类时,它会使用operator->作为调用对象调用类的a。如果您不明白,那么不要担心,当您进一步使用C ++时,您将会这样做。
  2. 头文件包含声明,而.cpp文件包含定义。当您想要编写可以从其他文件中使用的函数时,您需要它们。这是因为你可以根据需要拥有尽可能多的结构声明(即变量,函数,类等),但只能有一个该结构的定义。头文件包含在代码中的许多位置(每个需要使用其实现提供的工具的文件),并为包含它们的每个.cpp文件编译一次,因此不能放置任何只能有一个文件的文件在头文件中。实现文件(.cpp或.c文件)仅针对整个程序编译一次,因此它们是实现的正确位置(您只能拥有其中一个)。头文件也有助于实现和界面的分离。
  3. 但是,所有这些问题都可以通过一本优秀的C ++书来解答,所以请在购买和阅读之前先解决一下,这样可以节省大量时间和头痛。

答案 1 :(得分:1)

structure->member

相当于

(*structure).member

因此,它是一种捷径。它取消引用指针structure并访问成员member

答案 2 :(得分:1)

1)“箭头”操作符-> 与操作符.相同,但是当您使用指向结构而不是结构的指针时,这是一个快捷方式。请参阅this explanation,例如:

struct Point {
    int x;
    int y;
};

Point* p;      // p points to a Point struct

p = new Point;
p->x = 12;     // This is an useful shortcut for...
(*p).x = 12;   // .. this

2)关于头文件,它们不是必需的,你也可以在.c文件的开头添加声明,但是将声明和实际代码分开是一个有用的约定。

答案 3 :(得分:1)

好吧,我会尝试以简单的方式解释,让初学者更容易理解。

  1. 是的,它与dot相同,但它用于指针。

    MyClass a;
    a.myMethod();
    
    MyClass* b = new MyClass;
    b->myMethod();
    delete b;
    

    a和b都调用相同的方法,但是a在堆中分配,b是由new分配的指针。分配的内存明确应始终被释放(因此删除b语句)。 这实际上是一种简化,箭头所做的是取消引用指针并在其上调用点运算符。如果这让你的头在旋转,现在就采取简单的解释,随着你对这种语言的反应越来越大,它会稍后沉沦。

  2. 头文件不是强制性的,但它们可用于引用另一个文件中翻译单元中声明的内容。因此,例如,您在头文件中声明MyClass,而不是在myfilea.cpp和myfileb.cpp中都可以使用它,而不必花费太多精力来声明它。

    要正确理解您在使用以下语句时需要知道的头文件:

    #include "myheader.h"
    

    编译器的预处理器所做的是将myheader.h的所有内容复制并粘贴到包含它的文件中。由于编译器需要在使用它们之前了解类型(通常是类),因此在每个文件中都需要“重新声明类型是什么”。 实际上可以实现头文件中的所有内容,类似于看起来像Java代码的东西,然后在一个main.cpp文件中包含那些文件,但是代码将花费更长的时间来编译并且更难以遵循

答案 4 :(得分:0)

我认为你需要阅读一本关于C ++和C的书,' - >'和'。'不一样但差不多,头文件与编译器和内存布局有关。 C ++与实际的机器有关,而不是java,这意味着你必须以略微不同的方式思考编程。

我建议在C ++上阅读Bjarne Staustrups一书,或者至少浏览一下。如果C ++只是带有另一种语法的Java,那么就没有理由发明Java - 每种语言都有自己的应用程序,你需要在开始使用之前了解语言的含义。 : - )

答案 5 :(得分:0)

std::string str("foo");
std::string *str_p=new std::string("bar");   /
//Please use smart pointers in real code
std::cout <<  str.size() << "   " << str_p->size();

所以基本上->会使用指针而不是访问该类型的成员。

它也是平等的

(*str_p).size(); 

这里首先手动取消引用str_p,然后调用size成员函数。

答案 6 :(得分:0)

  1. test->name完全等于(*test).name,而不是test.name
  2. 标头用于在许多翻译单元中包含相同的定义,Java不使用它们,因为从不需要定义,所有对象都由指针使用。
  3. 看看这个例子:

    class A
    {
       B member;
    };
    

    如果你不包含B的定义,你就不能知道A类的大小。在java中,member将是一个指针,所以这没用。