C++类对象指针以及访问成员函数

16

我对C++还不太熟悉,想要用Qt处理一些东西,然后遇到了一个很困惑的问题:

各种教程上所述的概念是这样的:

Class *obj;

*obj - 将显示指针所指向内存中储存的对象的值
obj - 将是它所指向内存的地址

因此,我会这样做

*obj=new Class();

但是,如果我想要访问一个函数,我必须使用 obj->function1(); 而不是 *obj->function1();

-- 不确定为什么,因为对于普通对象 [normalObj.function1();],直接使用该值就可以了。

所以,对于指针对象,为什么我们使用内存引用来访问函数呢?或者说,在正常对象的情况下,它总是引用吗?

P.S:有人能向我介绍一份关于 C++ 指针用法的好教程吗?这样我就可以直接解决像这样的问题了。


1
“C++中指针的好教程”(http://dl.dropbox.com/u/6101039/Modern%20C%2B%2B.pdf) - Konrad Rudolph
4个回答

36
*符号用于定义指针和解引用指针。例如,如果我想创建一个指向int的指针,我可以这样做:int *ptr; 在此示例中,*被用来声明这是一个指向int的指针。现在,当您不声明指针并且使用*符号与已经声明的指针时,您正在对其进行解引用。正如您可能知道的那样,指针只是一个地址。当您解引用指针时,您正在获取该地址所指向的值。例如:
int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr;

这将打印出5。另外,如果您正在将指针分配给一个新地址,并且它不在声明中,则不使用*符号。所以:

int pointToMe = 5;
int *ptr;
ptr = &pointToMe;

这就是如何做到的。你也可以通过引用指针来为被地址指向的值赋新值。例如:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr; // Prints out 5
*ptr = 27;
std::cout << *ptr; // Prints out 27

现在,-> 作为解引用符号。它将解引用指针,然后使用成员函数和变量,就像您对非指针对象使用 . 一样。即使使用非指针对象,您也可以通过首先获取地址来使用 ->

CObj object;
(&object)->MemberFunction();

这只是指针的简要概述,希望能对您有所帮助。


8
您可以使用“正常”的 . 来访问对象成员,但您必须首先取消引用指针。
由于运算符优先级,这看起来像(* obj).member。对于那些认为这太难写的人, obj->member 是一个更短的替代方案。
如果您有一个类型为 Class 的对象 c *c.ptr表示取消引用Class的成员 ptr 的指针。这就是(* obj).member的另一个原因,它表示其他内容。

3

实际上,您是错的。您需要:

obj=new Class();

或者

Class *obj = new Class;

这两者完全不同。

Class *obj;
*obj = new Class;

无法编译。

objClass* 类型,因此您可以将其分配给它(以及 new Class 返回的内容)。


2
更精确地说,您可以按照以下步骤操作:
Class  obj;
Class* obj_ptr;

obj_ptr = &obj;

// Now onwards you can use the pointer to access data members and function

obj_ptr->a = 10; // Like this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接