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

C++——this关键字和new关键字

一、this 关键字

1. 什么是 this

this 是 C++ 中的一个隐式指针,它指向当前对象(即调用成员函数的对象),在成员函数内部使用,用于引用调用该函数的对象。每个类的非静态成员函数内部都可以使用 this

使用 this 可以明确指出成员函数正在操作的是哪个对象的数据成员。

2. 为什么需要 this

当成员函数的参数名与成员变量名相同时,可以用 this 来区分。

示例代码:
#include <iostream>
using namespace std;class Person {
private:string name;int age;public:// 构造函数,参数名与成员变量名相同Person(string name, int age) {this->name = name;  // 用 this 区分成员变量和参数this->age = age;}void printInfo() {// this 可以省略,但显式使用更清晰cout << "Name: " << this->name << ", Age: " << this->age << endl;}// 返回当前对象的引用(用于链式调用)Person& setName(string name) {this->name = name;return *this;  // 返回当前对象本身}
};int main() {Person p("Alice", 25);p.printInfo();  // 输出: Name: Alice, Age: 25// 链式调用p.setName("Bob").printInfo();  // 输出: Name: Bob, Age: 25return 0;
}
代码解释:
  1. 在构造函数中,参数名 name 和 age 与成员变量同名,用 this->name 表示成员变量。
  2. printInfo() 中 this 可以省略,但显式使用让代码更清晰。
  3. setName() 返回 *this(即当前对象的引用),支持链式调用。

3. this 的其他用途

  • 传递当前对象给其他函数
  • 在成员函数中返回当前对象本身
  • 解决局部变量与成员变量同名的问题
示例:
class Example {int value;
public:Example(int value) {this->value = value;  // 区分成员变量和参数}void show() {cout << "Value: " << value << endl;  // 等价于 this->value}Example& increment() {this->value++;  // 修改当前对象的成员return *this;   // 返回当前对象本身}
};

4. this 的注意事项

  • this 是指针,不是引用(*this 才是当前对象的引用)
  • 静态成员函数中没有 this(因为静态函数不属于任何对象)
  • 不要随意返回 this 的指针(可能导致悬空指针)

二、new 关键字

1. 什么是 new

new 是 C++ 中用于动态内存分配的运算符,它在堆(heap)上创建对象并返回指针。

2. 为什么需要 new

  • 在程序运行时(而非编译时)决定内存分配
  • 创建的对象生命周期不受作用域限制
  • 可以创建大型对象(栈空间可能不足)

3. 基本用法

示例代码:
#include <iostream>
using namespace std;class Dog {string name;int age;
public:Dog(string n, int a) : name(n), age(a) {}void bark() {cout << name << " says: Woof! I'm " << age << " years old." << endl;}~Dog() {cout << name << " is being destroyed." << endl;}
};int main() {// 在堆上创建 Dog 对象Dog* myDog = new Dog("Buddy", 3);myDog->bark();  // 输出: Buddy says: Woof! I'm 3 years old.// 必须手动释放内存delete myDog;  // 输出: Buddy is being destroyed.return 0;
}
代码解释:
  1. new Dog("Buddy", 3) 在堆上创建对象,返回指向它的指针。
  2. 通过指针访问成员用 -> 运算符。
  3. delete 释放内存并调用析构函数。

4. new 的高级用法

动态数组分配:
int main() {// 动态分配包含 5 个 int 的数组int* arr = new int[5];for (int i = 0; i < 5; i++) {arr[i] = i * 10;  // 赋值}for (int i = 0; i < 5; i++) {cout << arr[i] << " ";  // 输出: 0 10 20 30 40}cout << endl;// 释放数组要用 delete[]delete[] arr;return 0;
}
注意事项:
  • 数组必须用 delete[] 释放,单个对象用 delete
  • 忘记释放会导致内存泄漏。

5. new 的替代方案(现代 C++)

使用智能指针(推荐):
#include <memory>int main() {// 自动管理内存的 unique_ptrunique_ptr<Dog> smartDog(new Dog("Max", 4));smartDog->bark();// 不需要手动 delete,离开作用域自动释放// 更安全的 make_unique (C++14)auto smartDog2 = make_unique<Dog>("Charlie", 5);smartDog2->bark();return 0;
}

6. new 的注意事项

  • 必须配对使用 delete

int* p = new int;  // 分配
*p = 10;
delete p;         // 释放
  • 避免内存泄漏
void leakyFunction() {int* leak = new int[100];  // 分配但未释放// 如果中间发生异常,delete 永远不会执行
}  // 内存泄漏!
  • 不要重复释放
int* p = new int;
delete p;  // 正确
delete p;  // 错误!未定义行为
  • 检查分配是否成功(现代 C++ 中 new 失败会抛出 std::bad_alloc 异常)

  • 初始化分配的内存

// C++11 统一初始化
int* p1 = new int{42};  // 值初始化为 42// 默认初始化(值不确定)
int* p2 = new int;// 动态数组初始化为 0
int* arr = new int[10]();  // 所有元素初始化为 0

三、总结对比

特性this 关键字new 运算符
作用指向当前对象动态分配内存
返回值当前对象的指针新分配内存的指针
使用场景成员函数中访问当前对象需要运行时决定内存分配时
内存位置不适用(是指针)堆(heap)
生命周期不适用直到显式 delete 或程序结束
错误风险误用可能导致逻辑错误忘记释放导致内存泄漏

最佳实践建议:

  1. this 使用建议
    • 在成员变量和参数同名时使用
    • 需要返回当前对象时(链式调用)
    • 避免过度使用,保持代码清晰
  2. new 使用建议
    • 优先考虑栈分配或智能指针
    • 如果必须用 new,确保有对应的 delete
    • 对于数组,使用 std::vector 代替 new[]
    • 在 C++11+ 中,优先使用 std::make_unique/std::make_shared
  3. 现代 C++ 趋势
    • 减少裸 new/delete 的使用
    • 使用 RAII(资源获取即初始化)原则
    • 依赖标准库容器和智能指针管理资源
http://www.lryc.cn/news/584921.html

相关文章:

  • 专题 字符串 Unicode
  • 排序算法与前端交互优化
  • Elasticsearch混合搜索深度解析(下):执行机制与完整流程
  • JAVA JVM垃圾收集
  • 【C语言网络编程】HTTP 客户端请求(域名解析过程)
  • Django老年健康问诊系统 计算机毕业设计源码32407
  • 华为VS格行VS中兴VS波导随身WIFI6怎么选?流量卡OR随身WIFI,长期使用到底谁更香?
  • 优学教育实战03跟进管理
  • 亿级流量下的缓存架构设计:Redis+Caffeine多级缓存实战
  • 力扣-142.环形链表 II
  • 学习笔记(34):matplotlib绘制图表-房价数据分析与可视化
  • Anaconda及Conda介绍及使用
  • 基于生产者消费者模型的线程池【Linux操作系统】
  • React之旅-05 List Key
  • 《探索电脑麦克风声音采集多窗口实时可视化技术》
  • 基于MuJoCo的宇树科技G1机器人基础动作仿真研究
  • Java 大视界 -- Java 大数据在智能医疗远程手术机器人操作数据记录与分析中的应用(342)
  • 两台电脑通过网线直连形成局域网,共享一台wifi网络实现上网
  • 项目开发日记
  • 【web应用】若依框架中,使用Echarts导出报表为PDF文件
  • Kafka——应该选择哪种Kafka?
  • XPath 语法【Web 自动化-定位方法】
  • 【操作系统】线程
  • [特殊字符] 扫描式处理:Python 自动提取 PDF 中关键词相关表格并导出为 Excel
  • 云、实时、时序数据库混合应用:医疗数据管理的革新与展望(下)
  • lodash不支持 Tree Shaking 而 lodash-es可以
  • 零基础入门指南:华为数通认证体系详解
  • 代码随想录|图论|10水流问题
  • 视频人脸处理——人脸面部动作提取
  • 静电式 vs UV 光解:哪种油烟净化技术更适合你的餐厅?