在 C++ 中,"->" 表示什么?

3

5
从一段高级代码中问这样一个基础的问题真是有些奇怪。你到底是怎么走到这一步的?我建议你先读一本好的C++入门书籍,直到你熟悉所有的基础知识为止。 - Kerrek SB
1
@KerrekSB,我猜这可能是IDE的示例或模板项目。 - Michael Krelin - hacker
2
@Nanocom:当你在这里放置一个-1时,你是否告诉了OP应该搜索什么或者应该参考哪本书?或者甚至指引他/她朝着正确的方向前进?仅仅是过度热情的-1对任何人都没有帮助。 - Alok Save
1
这是相当基础的,你需要挑选一本好的C++书籍来学习。 - Alok Save
1
有没有人在这里使用过Qt和Qt的IDE(Qt Creator)?这是一个Qt Gui应用程序的基本“模板”。 - g19fanatic
显示剩余6条评论
6个回答

7

这意味着箭头左侧的对象是指向类或结构体实例的指针,右侧的名称是该类或结构体的成员。

在上下文中:

ui->setupUI(this);

这意味着ui是指向类Ui::MainWindow实例的指针,并且setupUI(this)是调用该类的setupUI成员函数并带有参数this

当您拥有一个类(或结构)的实际实例而不是指针时,您使用以下表示法:

Ui::MainWindow non_ptr; // not a pointer
non_ptr.setupUI(this);

严格来说,你也可以这样写:

(*ui).setupUI(this);

然而,如果你写代码时不使用 -> 箭头运算符,那么你将被正当地排斥。


2
在大多数情况下,x->y 等同于 (*x).y。像迭代器这样的东西可以重载 -> 来做一些额外的事情,但通常它只是一种简写方式。

5
有时候,除非不是这样。(在C++中可以重载运算符。) - Kerrek SB
2
我认为重载这些特定的运算符是不好的形式,因此在大多数合理的情况下应该是正确的。 - Toomai
1
@Toomai:这些运算符必须被重载,例如迭代器和智能指针。 - Oliver Charlesworth
是的,有时候是这样,但你可以说任何可以被重载的运算符都是如此。 - Michael Krelin - hacker
2
@OliCharlesworth,是的,它们当然是为迭代器重载的,但它们以一种语义上非常相似的方式进行了重载(迭代器模仿指针)。如果不是这样,那么这是一种不好的做法,应该避免。 - Tamás Szelei

2

ui->相当于(*ui).(访问由ui指向的对象的成员)。


2

ui->setupUi(this)实际上是(*ui).setupUi(this)的简写。

P.S.:有人给你的问题点了踩,所以我给它点了赞。对于那个点踩的人:来吧!这算什么?这可能是一个刚开始学习C++的人非常合理的问题。


2
我没有点踩。但是现在来说,谁会从像 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 这样的代码开始学习 C++ 呢?这对于初学者来说非常可怕... - Cratylus
没错,但我们并不了解他的情况。也许只是碰巧他卡在一些需要快速修复的Qt代码上。 - user500944
2
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 是在创建新的Qt GUI应用程序时,IDE将生成的代码。这可能是Qt新用户最简单的起点。 - sam-w
那是QtCreator生成的自动生成代码。 - Tamás Szelei

1

在C和C++中,它是一种表示我们通过指针访问变量的符号。


1

假设ui是指针类型(由使用new UI::MainWindow进行初始化暗示),那么ui->setupUi等同于*(ui).setUi

然而,也有可能为类重载operator->,在这种情况下,它基本上相当于ui.operator->(whatever)。值得注意的是,重载operator->的语义有些不寻常:x->被解释为(x.operator->())->y,因此重载的operator->必须返回某种类型,使得returned_object->y也是合法的--要么是另一个也重载了operator->的对象,要么是一个实际的指针。


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