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

2 beginner questions about c++

本文关键字:初学者 问题 c++ 2个      更新时间:2023-10-16

1。->有什么用?例如test->name与test.name相同吗?

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

  1. a是指针时,a->b(*a).b相同。这只是同一事物的方便语法。当a是一个类时,它调用以a为调用对象的类的operator->。如果你不理解这一点,那么别担心,当你在C++中取得更大进展时,你会的
  2. 头文件包含声明,而.cpp文件包含定义。当您想要编写可以从其他文件使用的函数时,您需要它们。这是因为一个结构(即变量、函数、类等)可以有任意多的声明,但该结构只能有一个定义。头文件包含在代码中的许多位置(由每个需要使用其实现提供的工具的文件),并且对于每个包含它们的.cpp文件都会编译一次,因此在头文件中只包含一个头文件是不可行的。整个程序的实现文件(.cpp或.c文件)只编译一次,因此它们是实现的正确位置(只能有一个)。头文件也是为了便于实现和接口的分离

然而,所有这些问题都可以用一本好的C++书来回答,所以在走得太远之前,请先买一本并阅读,这会节省很多时间和头痛。

好吧,我会尝试用一种简单的方式进行解释,让初学者更容易理解。

  1. 是的,它和点一样,但它用于指针。

    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代码,然后在一个主.cpp文件中包含这些文件,但编译代码需要更长的时间,而且更难遵循。

structure->member

相当于

(*structure).member

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

1)"箭头"运算符->与运算符.不同,但当您使用指向结构的指针而不仅仅是结构时,它是一种快捷方式。参见此说明,例如:

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文件的开头添加声明,但将声明和实际代码分开是一种有用的约定。

我想你需要读一本关于C++和C的书,'->'和'不一样。'但几乎,头文件与编译器和内存布局有关。与java相比,C++更多地是关于实际的机器,这意味着你必须以稍微不同的方式思考编程。

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

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();

所以基本上CCD_ 14延迟指针而不是访问该类型的成员。

这也等同于

(*str_p).size(); 

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

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

看看这个例子:

class A
{
   B member;
};

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