2个关于c++的初学者问题
2 beginner questions about c++
1。->有什么用?例如test->name与test.name相同吗?
2.头文件的用途是什么?我习惯了其他编程语言,比如java,其中只需要一个文件(类文件)。我们是否需要使用头文件来声明所有内容?
- 当
a
是指针时,a->b
与(*a).b
相同。这只是同一事物的方便语法。当a
是一个类时,它调用以a
为调用对象的类的operator->
。如果你不理解这一点,那么别担心,当你在C++中取得更大进展时,你会的 - 头文件包含声明,而.cpp文件包含定义。当您想要编写可以从其他文件使用的函数时,您需要它们。这是因为一个结构(即变量、函数、类等)可以有任意多的声明,但该结构只能有一个定义。头文件包含在代码中的许多位置(由每个需要使用其实现提供的工具的文件),并且对于每个包含它们的.cpp文件都会编译一次,因此在头文件中只包含一个头文件是不可行的。整个程序的实现文件(.cpp或.c文件)只编译一次,因此它们是实现的正确位置(只能有一个)。头文件也是为了便于实现和接口的分离
然而,所有这些问题都可以用一本好的C++书来回答,所以在走得太远之前,请先买一本并阅读,这会节省很多时间和头痛。
好吧,我会尝试用一种简单的方式进行解释,让初学者更容易理解。
-
是的,它和点一样,但它用于指针。
MyClass a; a.myMethod(); MyClass* b = new MyClass; b->myMethod(); delete b;
a和b调用相同的方法,但a是在堆中分配的,b是new分配的指针。分配的内存显式应该总是被释放(因此删除b语句)。这实际上是一种简化,箭头所做的是取消指针的引用,并在其上调用点运算符。如果这让你的头在此刻旋转,现在只需简单的解释,它会随着你对语言的熟悉而下沉。
-
头文件不是强制性的,但它们可以用来引用另一个翻译单元中在翻译单元中声明的内容。因此,例如,您在标头中声明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成员函数。
test->name
完全等于(*test).name
,而不是test.name
- 头用于在许多翻译单元中包含相同的定义,Java不使用它们,因为从来都不需要定义,所有对象都由指针使用
看看这个例子:
class A
{
B member;
};
如果不包含B的定义,就无法知道类A的大小。在java中,member
将是一个指针,所以这是无用的。
- 嵌套for循环C++的问题(初学者)
- 初学者问题:如何使用这些晦涩难懂的命令,例如C++中的'RenderWindow'
- 初学者问题:如何访问此变量?
- 您好,我是C++初学者,有这种问题.它给了我倍增的错误
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 初学者关于数组和指针的问题
- 模板编程初学者问题
- 在 Rcpp-Function 中使用布尔向量的子集(Rcpp 初学者的问题..)
- 我在C 初学者中发现了无限的循环问题
- 在C 中的初学者,我面临此问题错误C3867
- 有关循环冗余代码的初学者问题
- 初学者问题 - 致命错误LNK1561:必须定义入口点
- 关于编译器错误的初学者问题
- C++ 的初学者问题
- C++ 移动黑白函数的初学者问题
- 2个关于c++的初学者问题
- Qt C++简单的应用程序初学者问题
- 初学者问题:当对象位于向量中时,为什么我无法访问对象的成员?
- 如何使用这个 C++ 模板函数.简单的初学者问题
- 初学者问题生成文件不起作用