当前位置: 首页 > news >正文

聊聊 C++ 中那些容易踩坑的运算符

C++ 里的 :: . < << this this-> 各自是什么、怎么用、底层原理

这几个关键符号到底干嘛的?

:: —— 作用域解析运算符(scope resolution)

作用:告诉编译器“我要用的是某个作用域里的名称”。
常见用法:

  1. 访问命名空间中的东西
#include <iostream>int main() {std::cout << "Hello";  // std:: 是作用域,cout 是名字
}
  • std 是命名空间

  • :: 表示“在 std 这个作用域里找到 cout”

  1. 访问类的静态成员 / 枚举 / 嵌套类型
点击查看代码
class Robot {
public:static int count;
};int Robot::count = 0;   // 在类外定义静态成员
3. 区分全局变量 vs 局部变量
点击查看代码
int value = 10;      // 全局int main() {int value = 5;   // 局部std::cout << value << std::endl;   // 5std::cout << ::value << std::endl; // 10,:: 表示“全局作用域”
}
:: 完全是 编译期 概念,用来在“符号表”中查找正确的名字,不涉及运行时。 ### . —— 成员访问运算符(通过对象) 作用:通过一个“对象本身”访问它的成员变量 / 成员函数。
点击查看代码
class Robot {
public:void move() {}int id;
};Robot r;
r.id = 1;      // 通过 . 访问成员变量
r.move();      // 通过 . 调用成员函数
前提:r 是一个 对象(非指针)。 ### ->(this->) -> 是 通过指针访问对象成员 的运算符,本质上是:
点击查看代码
ptr->member   等价于   (*ptr).member
example:
点击查看代码
Robot r;
Robot* p = &r;p->move();   // 通过指针调用
(*p).move(); // 等价写法

this 和 this->
在 C++ 的非静态成员函数内部,编译器会自动给你一个隐藏参数 this:

点击查看代码
class Robot {
public:int id;void setId(int id) {this->id = id;        // this 是 Robot* 类型// 等价于:this->id = id;// 再等价:(*this).id = id;}
};
  • this 是指向当前对象的指针

  • 所以要访问成员必须 this->member

  • 很像 Python 里面的 self,但 Python 要自己写,C++ 自动传入。

< —— 两种完全不同的语义

  1. 比较运算符:小于号
点击查看代码
if (a < b) { ... }
2. 模板参数的界定符(语法)
点击查看代码
#include <vector>std::vector<int> v;     // 模板类
Eigen::Matrix<double, 6, 1> vec;
  • std::vector:vector 是类模板, 是模板参数

<< —— 也有两种含义:位移 or 流输出

  1. 位运算:左移
点击查看代码
int x = 1;
int y = x << 3;   // 结果 8,相当于 1 * 2^3
2. 流插入运算符(利用运算符重载)
点击查看代码
#include <iostream>int main() {std::cout << "x = " << 10 << std::endl;
}

<< 被重载为“把东西写入流中”的操作:

  • 左边:std::ostream 对象(如 std::cout)
  • 右边:要输出的内容

this —— 当前对象的指针

example

点击查看代码
class Robot {
public:int id;void setId(int id) {this->id = id;}
};
编译器会把上述改写成类似:
点击查看代码
void Robot::setId(Robot* this, int id) {this->id = id;
}
所以:
  • this 是一个隐式形参

  • 类型是 Robot*

  • this->member 访问成员变量

http://www.jsqmd.com/news/278377/

相关文章:

  • UE5 C++(42):创建 timeLine 时间轴
  • 快速落地 JT/T 808 服务端:jt-framework
  • 郑州top10研究生留学中介推荐,稳定可靠保障您的留学选择
  • 【高薪程序员必会知识点】:深拷贝 vs 浅拷贝——3个实战案例带你彻底掌握
  • Python批量处理Word文档:告别重复劳动的3个核心技巧
  • 2026年广州诚信的汽配加盟商城,汽车配件加盟,连锁汽配加盟厂家综合实力参考
  • 20260121人工智能作业v2
  • 2025年国内靠谱的假肢公司推荐与深度解析
  • 专利--授权及花费(发明)
  • Python模块导入失败怎么办?(ModuleNotFoundError深度解析与实战修复)
  • 连接PostgreSQL总是失败?,一文搞定Python与PostgreSQL无缝集成
  • 揭秘Python操作PostgreSQL数据库:5个步骤快速上手并避免常见陷阱
  • 【Python报错终极指南】:3步快速解决ModuleNotFoundError难题
  • 如何用Python将字符串秒变datetime对象?这4个方法最有效
  • 还在用random.randint?这7种高级随机数生成方法你必须掌握,告别初级写法
  • 中电金信:源启行业AI开发与服务平台荣获“大湾区珠港澳IT产品创新奖”
  • 必读感悟:软件测试中的心理健康挑战
  • OpenCV+Python摄像头开发,你不可错过的7个优化技巧
  • Python字典排序怎么按value排?这3种技巧你必须掌握
  • 2026年远程测试工作的智能化重构与神经多样性适配
  • 【实时图像处理核心技术】:用Python OpenCV打造低延迟视频监控系统
  • 完整教程:Qt Designer 和 PyQt 开发教程
  • 揭秘Python OpenCV实时画面处理:3步构建高性能摄像头应用
  • 未来展望:AI与人类协作的终极愿景——软件测试从业者的专业视角
  • 20260121人工智能作业v1
  • 【Python自动化办公终极指南】:3步实现多个Word文档高效合并
  • 智能网联汽车测试工具领衔,AI与云计算标准重塑测试行业格局
  • 2026必备!MBA论文写作TOP10 AI工具测评
  • 2026 APF有源滤波器厂家推荐:四大品牌综合实力测评与选型指南
  • 2026 年 1 月铝镁锰瓦厂家推荐排行榜:直立锁边/仿古/氟碳/金属板瓦,涵盖0.8mm至1.1mm及多种型号的铝镁锰合金屋面瓦实力甄选