news 2026/8/22 12:11:15

C++ 类与对象:this 指针与 const 成员函数详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 类与对象:this 指针与 const 成员函数详解

一、类结构设计示例

1.1 Point 点类

// ====================== Point 点类 ====================== class Point { private: float x; // x坐标 float y; // y坐标 public: // 1. 无参构造函数:默认 (0, 0) Point() { x = 0; y = 0; } // 2. 带参构造函数:自定义坐标 Point(float xVal, float yVal) { x = xVal; y = yVal; } // 设置x、y void setX(float xVal) { x = xVal; } void setY(float yVal) { y = yVal; } // 获取x、y(常成员函数) float getX() const { return x; } float getY() const { return y; } // 打印坐标点 void print() const { cout << "(" << x << ", " << y << ")"; } };

1.2 Line 线段类

// ====================== Line 线段类 ====================== class Line { private: Point a; // 起点 Point b; // 终点 public: // 1. 无参构造:两个点都默认为 (0,0) Line() { // a 和 b 自动调用 Point 的无参构造 } // 2. 带参构造:直接传入四个坐标值 Line(float x1, float y1, float x2, float y2) : a(x1, y1), b(x2, y2) // 初始化列表给 a、b 赋值 { } // 设置起点、终点 void setA(Point p) { a = p; } void setB(Point p) { b = p; } // 获取起点、终点 Point getA() const { return a; } Point getB() const { return b; } // 核心:计算线段长度 float getLength() const { float dx = a.getX() - b.getX(); float dy = a.getY() - b.getY(); return sqrt(dx * dx + dy * dy); } // 打印线段信息 void printLine() const { cout << "线段起点:"; a.print(); cout << " 终点:"; b.print(); cout << " 长度:" << getLength() << endl; } };

1.3 CDate 日期类

class CDate { private: int year; int month; int day; public: //无参构造:初始化列表 CDate() :year(1), month(1), day(1) {} //带参构造 CDate(int y, int m, int d) :year(y), month(m), day(d) {} //常成员打印 void PrintDate() const { printf("%4d/%02d/%02d\n", year, month, day); } };

1.4 Complex 复数类

class Complex { private: double real; double image; public: //设置成员 void setReal(double r) { this->real = r; } void setImage(double i) { this->image = i; } //常成员函数取值 double getReal() const { return this->real; } double getImage() const { return this->image; } //打印复数 void PrintInfo() const { cout << "(" << real << (image >= 0 ? "+" : "") << image << "i)" << endl; } //加法1:值传递参数 Complex Add(Complex c) { Complex tmp; tmp.real = this->real + c.real; tmp.image = this->image + c.image; return tmp; } //加法2:const引用参数+const成员 Complex Add(const Complex& c) const { Complex tmp; tmp.real = this->real + c.real; tmp.image = this->image + c.image; return tmp; } //运算符重载 + Complex operator+(const Complex& c) const { Complex tmp; tmp.real = this->real + c.real; tmp.image = this->image + c.image; return tmp; } };

二、类与对象内存模型(引出 this 指针)

2.1 内存节省原理

所有同类对象共用一份成员函数代码,每个对象只独立存储私有数据成员,避免每个对象复制函数造成内存浪费。

2.2 关键疑问

共用代码如何区分不同对象的数据?

编译器自动给非静态成员函数添加隐藏形参this 指针,调用时自动传入当前对象地址。

2.3 编译转换示例

c1.setReal(1.2) → 编译转换:setReal(&c1, 1.2) c2.setReal(3.4) → 编译转换:setReal(&c2, 3.4) // 函数内 real = r 等价 this->real = r

三、this 指针详解

3.1 this 基础属性

  • 存在范围:仅非静态成员函数自带隐式 this,全局函数、静态成员函数、友元无 this。
  • 指针类型
    • 普通成员函数:类名* const this
    • const 修饰成员函数:const 类名* const this
  • *const this:指针本身地址不可修改(不能 this=NULL)
  • const 类名*:不能通过 this 修改对象成员(常成员函数只读)
  • 不能手动声明 this,由编译器自动生成。

3.2 const 成员函数(this 被 const 修饰)

  • 语法:函数括号后加 const,例:double getReal() const;
  • 约束:const 成员函数不能修改对象的任何非静态成员变量(mutable 修饰的除外)。
  • 调用权限:const 对象只能调用 const 成员函数;非 const 对象可以调用 const 和非 const 成员函数。
  • 重载规则:const 和非 const 版本可以构成重载,编译器根据调用对象的 const 性质选择。

3.3 this 指针的应用场景

  • 区分同名成员:当形参名与成员变量名相同时,使用 this-> 明确指定成员变量。
  • 返回对象自身:实现链式调用,如return *this;
  • 在成员函数中调用其他成员函数:通过 this 指针传递当前对象。

四、测试代码示例

4.1 Point 和 Line 测试

int main() { // 测试 Point Point p1(1, 1); Point p2(4, 5); cout << "===== 点信息 =====" << endl; p1.print(); cout << endl; p2.print(); cout << endl; // 测试 Line Line line1(p1.getX(), p1.getY(), p2.getX(), p2.getY()); Line line2(0, 0, 3, 4); cout << "\n===== 线段信息 =====" << endl; line1.printLine(); line2.printLine(); return 0; }

4.2 CDate 测试

int main() { CDate dt1; //默认1/1/1 CDate dt2(2025, 7, 24);//自定义日期 dt1.PrintDate(); dt2.PrintDate(); return 0; }

4.3 Complex 测试

int main() { Complex c1, c2, c3; c1.setReal(1.2); c1.setImage(3.4); c2.setReal(3.4); c2.setImage(5.6); c1.PrintInfo(); c2.PrintInfo(); //重载+调用:c3=c1.operator+(c2) c3 = c1 + c2; c3.PrintInfo();//输出(4.6+9i) return 0; }

五、总结

本文通过四个完整的类示例(Point、Line、CDate、Complex)详细讲解了 C++ 类的基本结构设计,重点分析了类与对象的内存模型,并深入剖析了 this 指针的工作原理和 const 成员函数的使用。理解这些概念对于掌握 C++ 面向对象编程至关重要,特别是在考试和实际开发中都会频繁涉及。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 12:09:55

推荐几个程序员必逛的个人技术博客网站

推荐几个程序员必逛的个人技术博客网站&#xff0c;欢迎收藏哦。 1、美团技术团队 地 址: 美团技术团队简 介&#xff1a;美团技术团队的博客&#xff0c;干货满满。推荐指数&#xff1a;⭐⭐⭐⭐⭐ ​ 2、阮一峰的网络日志 地 址: 阮一峰的个人网站 - Ruan YiFengs Person…

作者头像 李华
网站建设 2026/8/22 12:09:07

Linux PipeWire深度解析之pw_thread_loop_new调用流程与实战(七十五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐&#xff1a;《Android系统多媒体进阶实战》&#x1f680; Android Audio工程师专栏地址&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; Android多媒体专栏地址&a…

作者头像 李华
网站建设 2026/8/22 12:03:46

【MATLAB例程,车联网17】基于CAV(网联自动驾驶车辆)的环形道路混合交通流拥堵波抑制仿真分析,并对比平均速度演变、速度波动标准差、拥堵比。附完整代码的下载链接

附代码下载链接。原创代码&#xff0c;欢迎讨论&#xff0c;请勿翻卖 文章目录程序简介场景建模对比方法运行结果MATLAB源代码程序简介 本例程面向混合交通流中的拥堵波抑制问题&#xff0c;在环形道路上设置少量CAV&#xff08;网联自动驾驶车辆&#xff09;车辆执行速度平滑…

作者头像 李华
网站建设 2026/8/22 12:02:42

xiaozhi-esp32:从零搭好AI语音助手

xiaozhi-esp32&#xff1a;从零搭好AI语音助手 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 你对桌上那块小圆屏说了句"关灯"&#xff0c;卧室的灯真的…

作者头像 李华
网站建设 2026/8/22 12:02:40

Windows 11黑屏死机全攻略:从驱动更新到硬件诊断的完整解决方案

最近在 Windows 11 上运行一些特定应用或游戏时&#xff0c;你是否遇到过视频播放到一半突然黑屏、系统卡死&#xff0c;甚至直接蓝屏重启的尴尬情况&#xff1f;特别是像“奇妙萌可”这类带有大量动画、音效和卡点特效的娱乐内容&#xff0c;更容易触发这类问题。这并非个例&a…

作者头像 李华