【Qt/C++】Qt/C++ 中 :: 和 . 到底有什么区别?

在刚开始写 Qt 或 C++ 的时候,很多人都会被两个符号绕晕:

  • ::
  • .

看起来都像是在"找某个东西",但它们的用法完全不一样。

如果这个点没搞清楚,后面看代码时会特别容易乱。

比如下面这些写法:

cpp 复制代码
ErrorHandler::instance()
msgBox.setIcon(icon)
QMessageBox::Information
QApplication::quit()

很多初学者一眼看过去,感觉都是"调东西",但其实它们背后的逻辑并不一样。

1. :: 是"通过类去找",. 是"通过对象去找"

这句话可以先背下来,因为后面很多判断都靠它。

::表示:我不是通过某个具体对象来访问,而是直接通过"类名"去找某个成员。

.表示:我手里已经有一个具体对象了,我要通过这个对象去调用它自己的成员。

这两个的区别,你可以简单理解成:

  • :: 更像是在说:"去这个类里面找"
  • . 更像是在说:"让这个对象自己去做"

这是理解它们的总开关。

2. :: 是干什么的?它表示"属于某个类的"

先看这个例子:

cpp 复制代码
ErrorHandler& ErrorHandler::instance()
{
    static ErrorHandler instance;
    return instance;
}

这里的:ErrorHandler::instance

意思就是:这个 instance 函数,是 ErrorHandler 这个类里面的函数。

因为现在是在类外面写函数实现,所以必须告诉编译器:

"我现在写的这个函数,属于哪个类。"

如果你只写:

cpp 复制代码
ErrorHandler& instance()

编译器会觉得这是一个普通的全局函数,而不是 ErrorHandler 类的成员函数。

所以这里必须写成:

cpp 复制代码
ErrorHandler& ErrorHandler::instance()

这就是 :: 的第一种常见用法:

用法一:在类外定义成员函数时,说明"这个函数属于谁"

再看这一段:

cpp 复制代码
void ErrorHandler::handlerError(ErrorType type, ErrorLevel level, const QString &message, QWidget *parent)

这里同样是一个意思:

  • handlerError 这个函数
  • 不是随便写的独立函数
  • 它是 ErrorHandler 类里的成员函数

所以也要用:ErrorHandler::来说明归属。

3. . 是什么:通过"对象"去调用

再看另一类写法:

cpp 复制代码
msgBox.setIcon(icon);
msgBox.setText(message);
msgBox.exec();

这里的 msgBox 不是类名,而是前面创建出来的一个具体对象

cpp 复制代码
QMessageBox msgBox(parent);

既然 msgBox 已经是一个真正存在的对象了,那么后面要设置图标、设置文字、执行弹窗,就应该通过它自己去调用函数,所以这里用的是 .

这时候你可以把 . 理解成:"这个对象自己的"

比如:

  • msgBox.setIcon(icon):让 msgBox 这个对象设置图标
  • msgBox.setText(message):让 msgBox 这个对象设置显示文字
  • msgBox.exec():让 msgBox 这个对象执行显示

所以 . 的核心很简单:手里已经有对象了,就用 .

4. 为什么代码里会同时出现 ::.

这是初学者最容易懵的地方。比如这种写法:

cpp 复制代码
ErrorHandler::instance().logError(...)

看起来一行里既有 ::,又有 `.``,很容易乱。其实只要分两步看就很清楚了:

第一步:ErrorHandler::instance()

这里是通过类名 ErrorHandler 去拿那个全局唯一的对象,所以用 ::

第二步:.logError(...)

因为前面 instance() 已经返回了一个具体对象,所以现在是在用这个对象去调用它的成员函数,因此这里要用 .

也就是说,这一整句其实可以翻译成:

先从 ErrorHandler 类里拿到那个对象,再让这个对象去执行 logError。

这样一拆开,就不乱了。

5. 一句最通俗的总结

如果用一句最接地气的话来概括:

:: 是"去类里找",. 是"让对象自己做"。

在代码里:

  • ErrorHandler::instance():去类里拿对象
  • QMessageBox::Information:去类里拿固定选项
  • msgBox.setText(message):让对象自己设置内容
  • msgBox.exec():让对象自己执行显示

把这个逻辑想清楚之后,再看 Qt 代码就不会觉得一团乱了。

0voice · GitHub

相关推荐
REDcker2 小时前
C++跨平台与跨语言绑定工具:SWIG、Djinni 等选型
开发语言·c++
傻啦嘿哟2 小时前
Python 操作 Word 文档属性与字数统计方法详解
开发语言·c#
郝学胜-神的一滴2 小时前
[ 力扣 1124 ] 解锁最长良好时段问题:前缀和+哈希表的优雅解法
java·开发语言·数据结构·python·算法·leetcode·散列表
戴西软件2 小时前
戴西CAxWorks.VPG车辆工程仿真软件|假人+座椅双调整 汽车仿真效率直接拉满
java·开发语言·人工智能·python·算法·ui·汽车
北漂Zachary2 小时前
PHP vs C++ vs 易语言:三大语言对比解析
开发语言·c++·php
Tairitsu_H2 小时前
C++入门指南:从基础语法到核心特性全解析
c++·算法·基础
Pentane.2 小时前
力扣HOT100:T.1 两数之和|循环遍历算法笔记及打卡(12/100)
c++·笔记·算法·leetcode
FeBaby2 小时前
使用mat 分析java OOM问题
java·开发语言
王老师青少年编程2 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:士兵站队
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·士兵战队