C++知识点11——this指针,const成员函数,访问权限控制

C++指针本质:野指针、const与this的内存真相 指针是C++内存操作的核心抽象,其本质是存储内存地址的变量;理解指针需从栈与堆的物理布局出发,掌握空指针(0x00000000)、野指针(如0xCCCCCCCC或已释放仍被解引用的地址)及未初始化指针三者的根本区别;const并非语法装饰,而是编译器强制执行的内存访问契约,直接影响this指针语义与智能指针行为;真实调试中,VS2022内存窗口和监视器比cout更可靠,能直观揭示*p值与地址内容的时空一致性;本文聚焦初中生可感的内存具象化教学,覆盖野指针成因、const双重修饰逻辑、atoi报错根源及thi 阅读详情

1.this指针

每个类都有this指针,this指针指向this指针指向的是类的对象本身

class A
{
public:
	A() {}
	~A() {}
	void func() {cout<<this<<endl;}
};

int main(int argc, char const *argv[])
{
	A t1,t2;
	cout<<&t1<<endl;
	t1.func();
	cout<<&t2<<endl;
	t2.func();
	return 0;
}

通过上述结果可知,this指针的值和类各自的对象的地址值相等。

 

当类的不同对象调用相同的成员函数时,会将this指针隐式传入成员函数,从而可以根据this指针来操作相同的成员变量

void A::func2(int para)
{
	a=para;
	cout<<this->a<<endl;
}

int main(int argc, char const *argv[])
{
	A t1,t2;
	t1.func2(10);
	t2.func2(20);
	return 0;
}

t1和t2在第九行执行初始化时,自动调用了构造函数,将this指针初始化为t1和t2的地址,在调用成员函数func2时,隐式地用自身的地址初始化this指针,同样是打印this->a,实际上是打印t1.a和t2.a

所以通过this指针可以对同一个类的不同对象进行区分,防止类的不同对象的同名变量混淆

 

此外,在对象调用成员函数时,由编译器自动隐式初始化this指针,所以不能显示初始化this指针,而且,this指针一旦初始化完成,就会一直指向这个类的对象,所以this指针是个const指针

 

2.const成员函数

const成员函数就是在类的成员函数的形参列表后面加上const关键字,作用是将this指针指向的对象置为const,所以,调用成员函数时,不能在const成员函数中修改类的对象。因为是修饰this,而普通函数和static成员函数没有this,所以不能在static成员函数和普通函数后面加const修饰

举例

class A
{
public:
	A() {}
	~A() {}
	A constfunc() const;

private:
	int a;
};

A A::constfunc() const 
{
	cout<<__func__<<endl;
 //a=10;
	return *this;
}

int main(int argc, char const *argv[])
{
	A t1;
	A t2= t1.constfunc();
	return 0;
}

上述代码中,类A的对象t2接收t1的拷贝,因为返回了*this,如果想接收t1本身,那么可以将函数的返回值定义为类A的引用

如果将代码15行解除注释,就会产生如下错误

显示成员变量a是只读的,如果将const修饰符去掉,则也能顺利编译通过

所以当有const修饰成员函数时,就不能在成员函数中对类的对象进行修改,

因为有const修饰成员函数时,this指针指向的对象是const的,而成员变量变化时,表示类的对象变化,所以报错

 

但是并不是所有的成员变量都不能在const成员函数中改变,如果一个成员变量用mutable来修饰,那么该成员变量就可以在const成员函数中被修改

class A
{
public:
	A() {}
	~A() {}
	A constfunc() const;

private:
	mutable int m;
};

A A::constfunc() const 
{
	cout<<__func__<<endl;
	m=10;
	cout<<m<<endl;
	return *this;
}

int main(int argc, char const *argv[])
{
	A a;
	a.constfunc();
	return 0;
}

可见,编译成功并且打印出m的值

 

此外,类的const对象和类的const对象的引用和指针只能调用const成员函数

举例

class A
{
public:
	A() {}
	~A() {}
	void func2(int para);
	A constfunc() const;

private:
	int a;
};

void A::func2(int para)
{
	//a=para;
	cout<<this->a<<endl;
}

A A::constfunc() const 
{
	cout<<__func__<<endl;
	return *this;
}

int main(int argc, char const *argv[])
{
	const A a;
	a.func2(10);
	return 0;
}

因为a是const对象,而非const成员函数有可能改变对象a中某些成员变量,所以报错,const对象的指针和引用也是一样,因为const对象的指针和引用不能改变所绑定和指向的对象

 

3.访问权限控制

上面代码在类的定义的过程中都出现了public和private,public访问控制符表示该访问控制符下面的成员在整个程序中是可访问的,而private访问控制符表示该访问符下面的成员只能在类中的成员函数中才能被访问

class A
{
public:
	A() {}
	~A() {}

private:
	int a;
};

int main(int argc, char const *argv[])
{
	A a;
	cout<<a.a<<endl;
	return 0;
}

因为a是私有的,main函数没有访问权,所以不能在main函数中使用,报错

 

但是可以定义一个public的成员函数,在main函数中修改a的值并打印a

class A
{
public:
	A() {}
	~A() {}
	void seta(int i);

private:
	int a;
};

void A::seta(int i)
{
	a=i;
	cout<<a<<endl;
}

int main(int argc, char const *argv[])
{
	A a;
	a.seta(10);
	return 0;
}

对象a能够调用seta函数,就是因为seta是public的。

 

在C++中,class和struct都可以用来实现自己的类,它俩的区别就是class定义的类,如果不加访问权限说明符,那么默认权限是private,而struct默认是public

 

参考:

《C++ Primer》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++ this指针深度解析:从原理到实战应用 在C++面向对象编程中,成员函数通过隐式参数机制访问对象数据,这一机制的核心是this指针。从编译器视角看,每个非静态成员函数都隐含一个指向当前对象的this指针参数,它决定了函数如何操作对象实例数据。理解this指针的类型转换(如在const成员函数中变为const指针)是实现逻辑常量性和函数重载的基础。这一原理的技术价值在于支持链式调用、实现拷贝赋值运算符、构建流畅接口等高级编程模式。在实际工程中,this指针广泛应用于解决命名冲突、实现多态回调、构建复杂对象关系等场景。特别是在现代C++开发中,正确使 阅读详情

相关推荐

C++ const关键字深度解析:从内存模型到工程实践

在C++编程中,类型系统与内存管理是核心基础,而const关键字正是连接这两者的关键契约。它并非简单的“常量”修饰符,而是一种编译期访问控制机制,定义了对象或数据的“访问权限”。从原理上看,const在编译阶段施加约束,编译器基于此承诺进行优化(如常量传播)并实施类型检查,这直接关系到程序的未定义行为(UB)与安全性。其技术价值在于保障代码的常量正确性,通过顶层const与底层const的区分,精确控制指针、引用的可变性,从而在函数重载、拷贝赋值和模板推导中发挥关键作用。在工程实践中,const广泛应用于函

weixin_30905981的博客 423

C++11之语法篇

随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法, 都要重新去写一个仿函数,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),函数对象,又称为仿函数,即可以像函数一样使用的对象,就是在类中重载了operator()运算符的类对象。

weixin_56054625的博客 1179

C++核心关键字深度解析:从const、static到现代C++新特性实战指南

在C++编程中,关键字是构建类型系统、控制内存布局和实现多态等核心机制的基石。理解关键字的原理,能帮助开发者编写出更安全、高效且意图清晰的代码。例如,`const`关键字通过强制不变性来保障数据安全与接口契约,而`static`则在不同上下文中管理变量的生命周期与链接性,直接影响程序的存储期与封装性。这些基础概念的价值在于,它们为零开销抽象和资源管理提供了语言层面的支持,广泛应用于高性能计算、系统编程和游戏引擎等对效率要求苛刻的场景。本文聚焦于`const`、`static`、`explicit`及`con

hqmln的博客 694

C++【11】this指针

this指针 作用:指向当前函数所作用的对象 计算机编译C++程序时===C++程序到C程序的翻译 将C++的成员函数改写为C语言的全局函数,参数个数比C++多一个 *this,即局部函数所指向的对象 ======C++========== class CCar { public: int price; void SetPrice(int p); }; void::SetPrice(int p) { price=p; } int main()

weixin_44644457的博客 303

FPGA远程升级避坑指南:用AXI Quad SPI IP读写N25Q128 Flash的完整流程

本文详细介绍了FPGA远程升级过程中使用AXI Quad SPI IP读写N25Q128 Flash的完整流程,包括IP核配置、Flash操作指令集、双镜像备份设计及生产级远程升级协议。通过最佳实践和避坑策略,帮助开发者实现可靠的镜像更新方案,提升系统可靠性和可维护性。

weixin_30542079的博客 674

Windows下Cppcheck静态测试全流程:从安装到生成HTML报告的避坑指南

本文详细介绍了在Windows平台下使用Cppcheck进行静态代码分析的全流程,包括环境搭建、插件配置、自动化脚本编写及HTML报告生成。重点解析了MISRA插件集成、常见问题排查以及性能优化技巧,帮助C/C++开发者高效提升代码质量。文章特别针对Windows环境下的路径处理、空格问题等细节提供了实用解决方案。

weixin_29313547的博客 201

C++_this指针详解

http://blog.chinaunix.net/uid-21411227-id-1826942.html

qq_28090573的博客 1030

基于Lumerical FDTD的光栅耦合器宽带特性仿真与实验验证

本文详细介绍了基于Lumerical FDTD软件对光栅耦合器进行宽带特性仿真的完整流程。通过复现一个针对1310nm波段优化的经典光栅耦合器案例,文章从结构建模、光源设置、监视器布置到仿真运行与结果分析,逐步解析了如何准确模拟其耦合效率与带宽特性,并将仿真结果与实验数据进行对比验证,为硅光芯片的设计与优化提供了实用指导。

weixin_29294597的博客 512

C++ const的使用,this指针,常方法(面试最爱问的this指针)

文章目录:1. const的使用2. this指针2.1 前言(this指针的引出)2.2 什么是this指针 1. const的使用 const的使用有以下四种情况: const int* p int const *p int* const p const int* const p 我们可以通过以下图解来理解这四种情况const到底修饰的是谁: 当const在 “ * ” 的左边,则指向的值不能被修改 当const在 “ * ” 的右边,则自身不能被修改 2. this指针 2..

HanMeng的博客 2416

动态刷新曲线_【GhPython应用】利用反射刷新Image sampler组件

【版权声明】| 作者:月之眼|案例图片来源:Sergiu Radu Pop的facebook| 如有侵权,请联系大水牛平台|如果觉得文章不错,欢迎分享效果展示利用python刷新Image sampler组件,主要的思路就是X输入端:输入要切换的图片路径,我的案例中输入了9张图片。然后通过100毫秒切换一张图片显示,来达到动态显示效果。代码分析run输入端类型:bool (I...

weixin_42393829的博客 532

动态数据脱敏技术分析

在当前国内信息安全热潮中,数据脱敏作为数据安全的重要一环得到了业界的认可与重视。早在2012年,数据脱敏首次作为一个单独的魔力象限由Gartner发布,Gartner在2014年又提出了:按照数据使用场景,将数据脱敏分为静态数据脱敏(Static data masking-SDM )与动态数据脱敏(Dynamic data masking-DDM )。 可能有人望文生义,认为动态数据脱敏一定比静态数据脱敏高级。非也非也,静态or动态,取决于脱敏的使用场景,主要是以使用场景为由来选择合适的数据脱敏的模式。 本

美创科技的博客 4675

C++ this指针深度解析

一、C++ 程序到C程序的翻译 C++ 是在C语言的基础上发展而来的,第一个 C++ 的编译器实际上是将 C++ 程序翻译成C语言程序,然后再用C语言编译器进行编译。C语言没有类的概念,只有结构,函数都是全局函数,没有成员函数。翻译时,将 class 翻译成 struct、对象翻译成结构变量是显而易见的,但是对类的成员函数应该如何翻译?对myCar.Modify();这样通过一个对象调用成员函数...

love、reading的博客 703

kettle写doris操作

文件在目录:doris-master\extension\kettle\assemblies\plugin\target\doris-stream-loader-plugins-9.4.0.0-343.zip。官方提供了doris stream load插件,下载源码编译后放到kettle的插件目录即可使用。地址:https://github.com/apache/doris.git。注意:需要doris插件或者kettle转换生成模板的私聊博主。使用PDmaner同步业务库生成建表语句。

weixin_44449054的博客 3031

C++面向对象编程:从类与对象基础到封装、构造与this指针详解

面向对象编程(OOP)是一种以对象为核心的编程范式,它将数据和操作数据的方法封装在一起,形成类。其核心原理是通过抽象、封装、继承和多态四大特性,构建更贴近现实世界的软件模型。在C++中,类作为对象的蓝图,定义了数据成员和成员函数,而对象则是类的具体实例。这种封装技术不仅提高了代码的安全性和可维护性,还通过访问控制(public、private、protected)实现了信息隐藏。构造函数与析构函数管理对象的生命周期,确保资源的正确初始化和释放。this指针作为成员函数的隐式参数,使得函数能够操作调用它的特定

weixin_34021089的博客 302

AI上推荐 之 多任务loss优化(自适应权重篇)

1. 写在前面 在多任务学习中,往往会将多个相关的任务放在一起来学习。例如在推荐系统中,排序模型同时预估候选的点击率和浏览时间。相对于单任务学习,多任务学习有以下优势: 多个任务共享一个模型,占用内存量减少; 多个任务一次前向计算得出结果,推理速度增加; 关联任务通过共享信息,相互补充,可以提升彼此的表现。 前面的一篇文章,主要是从模型结构的角度聊了下多任务学习,介绍了工业界非常经典也常用的MMOE模型,然而,对于多任务学习, Loss的优化也非常重要, 因为我们知道通过多个目标去指导网络进行统一的训练

Miracle8070 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++类成员函数重载:从this指针到继承体系的深度解析

函数重载是C++多态性的基础实现方式之一,它允许在同一作用域内定义多个同名函数,通过参数列表的差异实现不同的功能。其核心原理在于编译器在编译期间根据函数签名(包括参数类型、数量和顺序)进行名称修饰和匹配。这一机制极大地提升了代码的表达能力和复用性,是构建直观API和实现泛型编程的重要技术手段。在面向对象编程中,当重载进入类的范畴,情况变得更加复杂:隐式的this指针成为重载决议的“第零个参数”,const成员函数和引用限定符重载允许根据对象的常量性和值类别提供不同实现,而继承体系下的重写(Override)

weixin_30847865的博客 413

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++】类和对象(两万字大总结,细节巨多)

类和对象

qq_66314292的博客 6181

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++入门必知:指针引用、const、内存管理与STL核心细节解析

在C++编程中,理解基础概念和底层原理是写出健壮代码的关键。从计算机内存管理的基本原理出发,程序运行时数据存储在栈或堆中,栈内存自动管理而堆内存需手动分配释放,这直接关系到程序的性能和安全性。C++通过RAII(资源获取即初始化)技术,将资源生命周期与对象绑定,利用智能指针自动管理内存,有效防止内存泄漏,体现了其系统级编程的价值。在实际开发中,掌握指针与引用的本质区别、const关键字的多种用法、以及STL容器如vector和string的正确使用,能帮助开发者避免常见陷阱,提升代码质量。这些核心知识点正是

weixin_33937499的博客 692

C++入门基础(三):const引用、指针和引用的关系、inline(修饰内联函数)替代宏、nullptr代替null

本文探讨了C++中const引用、指针与引用的区别、内联函数和nullptr等关键概念。const引用的权限只能缩小不能放大,即不能通过非const引用修改const对象。指针和引用在语法概念、初始化要求、可变性等方面存在显著差异。内联函数(inline)作为宏的替代方案,能提高效率但可能被编译器忽略,建议直接在头文件中定义。C++11引入的nullptr解决了NULL可能导致的类型混淆问题,应优先使用nullptr表示空指针。这些特性展示了C++对类型安全和性能优化的重视。

2302_80761497的博客 1228

C++基础必考题:struct和class区别、const与static一次讲清,GameDeveloper-Client-Interview入门图解指南

本文带你快速搞懂 **C++面试题** 中的四大高频考点:**struct和class的区别**、**const**、**static** 以及游戏客户端面试的其他必会内容。这些知识都来自开源项目 **GameDeveloper-Client-Interview**(游戏客户端开发者面试清单),它系统整理了 C++、C#、Unity、Unreal、OS、设计模式等面试高频问答,是准备游戏客户端开发

gitblog_01136的博客 424

C++面向对象编程:从类与对象基础到封装、构造与拷贝控制

面向对象编程是一种将数据和操作数据的方法封装在一起的编程范式,其核心思想是通过类和对象来模拟现实世界中的实体与行为。在C++中,类作为对象的蓝图,定义了数据成员和成员函数,而对象则是类的具体实例。这种机制通过封装实现了数据隐藏和保护,提升了代码的安全性和可维护性。理解构造函数与析构函数是掌握对象生命周期管理的关键,它们分别负责对象的初始化和资源清理。此外,拷贝控制(包括拷贝构造函数和拷贝赋值运算符)对于管理包含动态资源的对象至关重要,能有效防止浅拷贝导致的问题。这些概念共同构成了C++面向对象编程的基础,广

diandingyin9417的博客 408

2.类与对象-上【由浅入深-C++】

由于c++的类与对象较为繁琐复杂,本文介绍类与对象部分的相关内容。

插花弄玉的博客 1034

C语音static、const、voilate和位运算

一 static 1 在C语言中   1、加了static的全局变量和函数,对其他源文件隐藏(不能跨文件了)。   2、static修饰的函数内的局部变量,生存期为整个源程序运行期间,但作用域仍为函数内。   3、static变量和全部变量一样,存在静态存储区,会默认初始化为0。 2 在C++语言中,仍然有上面的作用,但多了以下两点   1、声明静态成员变量,需要在类体外使用作用域运算符进行初始化......

kessity的博客 1732

c++基础补强-Day04

命名空间内部再定义 namespace,形成层级结构,适合多层级代码分组(如项目→模块→工具)。:无名称,内部内容仅当前文件可见,替代 static 做文件私有函数 / 变量。(using 指令):引入全部符号,简写方便但易重名,仅小型程序用。3. using 指令(using namespace 空间)二、访问命名空间元素:using 声明 /using 指令。(using 声明):仅引入单个符号,冲突少,工程推荐;:空间内再套空间,层级管理;2. using 声明(using 标识符)

weixin_55526229的博客 252
上一篇: Python进阶6——序列操作
下一篇: C++知识点12——构造函数初步
Master Cui
博客等级 码龄9年 1408粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值