一、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.pswp.cn/news/914172.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914172.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914172.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中类静态方法:@classmethod/@staticmethod详解和实战示例

在 Python 中&#xff0c;类方法 (classmethod) 和静态方法 (staticmethod) 是类作用域下的两种特殊方法。它们使用装饰器定义&#xff0c;并且与实例方法 (def func(self)) 的行为有所不同。1. 三种方法的对比概览方法类型是否访问实例 (self)是否访问类 (cls)典型用途实例方法…

FastGPT革命:下一代语言模型的极速进化

本文深度解析FastGPT核心技术架构&#xff0c;涵盖分布式推理、量化压缩、硬件加速等前沿方案&#xff0c;包含完整落地实践指南&#xff0c;助你掌握大模型高效部署的终极武器。引言&#xff1a;当大模型遭遇速度瓶颈2023年&#xff0c;ChatGPT引爆全球AI热潮&#xff0c;但企…

Geant4 安装---Ubuntu

安装工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安装Qt可视化工具(不需要可视化可以不安装) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安装Ope…

Spring Boot中请求参数读取方式

目录 一、前言 二、六种参数读取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、对比和搭配 1.适用方法类型及建议使用场景 2.建议使用的请求路径注解 3. 多种参数同时使用 4.同一请求不同方案&#xff1f…

2025华为OD机试真题最新题库 (B+C+D+E+2025A+2025B卷) + 在线OJ在线刷题使用(C++、Java、Python C语言 JS合集)(正在更新2025B卷,目前已收录710道)

2025年&#xff0c;已经开始使用AB卷题库&#xff0c;题目和往期一样&#xff0c;旧题加新题的组合&#xff0c;有题目第一时间更新&#xff0c;大家可以跟着继续学习&#xff0c;目前使用复用题较多&#xff0c;可在OJ上直接找到对应的AB卷学习&#xff0c;可以放心学习&#…

分析新旧因子相关性

计算一组新因子、并分析它们与已有因子间的相关性1. 导入库和初始化环境功能代码解析数据加载2. 定义新因子计算函数功能代码解析因子 1&#xff1a;波动率过滤器&#xff08;filter_001_1&#xff09;因子 2&#xff1a;ATR 过滤器&#xff08;filter_001_2&#xff09;因子 3…

Unity Demo——3D平台跳跃游戏笔记

今天是一个3D平台跳跃游戏的笔记。我们按照以下分类来对这个项目的代码进行学习&#xff1a;核心游戏系统 (Core Game Systems)核心游戏系统是IkunOdyssey项目的基础&#xff0c;负责所有游戏对象&#xff08;如玩家、敌人、道具等&#xff09;的通用行为和物理交互。它通过实体…

【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序

文章目录数组指针/指针数组函数指针函数指针数组函数指针数组用途(转移表)回调函数qsort函数基于qsort改造冒泡排序源码数组指针/指针数组 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是数组指针变量int* arr2[5] { 0 }; //arr2是指针数组指针数组是存放指…

vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值

遇到这样一个问题&#xff0c;我有个1个页面A&#xff0c;一个from表单组件&#xff0c;一个form-item组件&#xff0c; 使用是这样的&#xff0c;我在父组件A中使用 &#xff0c;执行表单验证一直提示没有值咱们先来讲一讲ref 和reactive的区别 ref 用来创建一个基本类型或单…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout&#xff08;框布局&#xff09; 采用QBoxLayout类可以在水平和垂直方向上排列控件&#xff0c;QHBoxLayout和 QVBoxLayout类继承自QBoxLayout类。 QHBoxLayout&#xff08;水平布局&#xff09; 采用QHBoxLayout类&#xff0c;按照从左到右的顺序来添加控件。QHBoxL…

Grok 4作战图刷爆全网,80%华人横扫硅谷!清华上交校友领衔,95后站C位

来源 | 新智元短短两年&#xff0c;马斯克Grok 4的横空出世&#xff0c;让xAI团队一举站上AI之巅。昨日一小时发布会&#xff0c;Grok 4让所有人大开眼界&#xff0c;直接刷爆了AIME 2025、人类最后的考试&#xff08;HLE&#xff09;两大基准。这是狂堆20万GPU才换来的惊人成果…

AI大模型(七)Langchain核心模块与实战(二)

Langchain核心模块与实战&#xff08;二&#xff09;Langchian向量数据库检索Langchian构建向量数据库和检索器批量搜索返回与之相似度最高的第一个检索器和模型结合得到非笼统的答案LangChain构建代理通过代理去调用Langchain构建RAG的对话应用包含历史记录的对话生成Langchia…

Flutter基础(前端教程①-容器和控件位置)

一个红色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按钮下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目录 flex-box和flex-item 主轴和副轴 ​编辑 flex-box的属性 flex-direction flex-wrap flex-flow justify-content ​编辑​align-items align-content flex-item的属性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 当把一个块级元素的displ…

【JMeter】执行系统命令

步骤如下&#xff1a; 添加JSP233 Sampler&#xff1a;右击线程组>添加>取样器>JSR223 Sampler2.填写脚本&#xff0c;执行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent开发学习系列 - langchain之memory(1):内存中的短时记忆

内存中的短时记忆&#xff0c;在 LangChain 中通常指 ConversationBufferMemory 这类“对话缓冲记忆”工具。它的作用是&#xff1a;在内存中保存最近的对话历史&#xff0c;让大模型能理解上下文&#xff0c;实现连续对话。 对话缓冲记忆”工具 主要特点 只保留最近的对话内容…

uniapp实现微信小程序端图片保存到相册

效果图展示 安装插件海报画板导入到项目里面&#xff0c;在页面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相册</button><image :src"path" mode"widthFix" v-if&qu…

Java生产带文字、带边框的二维码

Java 生成带文字、带边框的二维码1、Java 生成带文字的二维码1.1、导入jar包1.2、普通单一的二维码1.2.1、代码示例1.2.2、效果1.3、带文字的二维码1.&#xff13;.&#xff11;、代码示例1.3.2、效果2、带边框的二维码2.1、代码示例2.2、带边框的二维码效果 1、Java 生成带文字…

ARM单片机启动流程(三)(栈空间综合理解及相关实际应用)

文章目录1、引出栈空间问题2、解决问题2.1、RAM空间2.2、RAM空间具体分布2.3、关于栈空间的使用2.4、栈溢出2.5、变量的消亡2.6、回到关键字static2.7、合法性的判断1、引出栈空间问题 从static关键字引出该部分内容。 为什么能从static引出来&#xff1f; 在使用该关键字的…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 键控LED实验

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1.实验简介 实验目的&#xff1a; 从创建工程到编写代码&#xff0c;完成引脚约束&#xff0c;最后生成 bit 流下载到…