C++中常对象与常成员函数以及this与成员函数的联系与区别

本文详细解析了C++中的const修饰符作用及其在不同场景下的应用,包括const对象、const成员函数的概念与使用限制,以及如何正确地利用const提高程序的可靠性和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class A
{
};
/*

小记:对于const声明的对象,针对哪个变哪个不变得问题,实际上就是const后的整体不变
e.g.:
const int *A; 或 int const *A; //const修饰指向的对象,A可变,A指向的对象不可变
int *const A;   //const修饰指针A, A不可变,A指向的对象可变
const int *const A; //指针A和A指向的对象都不可变

*/
1. 常对象
用const修饰的对象叫对象常量,其格式如下:〈类名〉const 〈对象名〉 或者 const 〈类名〉〈对象名〉
声明为常对象的同时必须被初始化,并从此不能改写对象的数据成员。
常对象只能调用常成员函数,而非常对象既可以调用非常成员函数又可以调用常成员函数
2. 常成员函数
常成员函数含义是通过该函数只能读取同一类中的数据成员的值,而不能修改它(在const成员函数中: 可以修改被定义成mutable的成员变量或者静态成员变量(因为成员函数一般针对对象而言,而静态的成员是对类而言的))。C语言中,volatile
其格式如下:〈类型〉〈函数名〉(〈参数表〉)const;
常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数。常对象只能调用类的常成员函数。总之,常成员函数不能够以任何方式改变数据成员对的值,包括直接(函数体自身),间接(调用其他的非常成员函数来改变)均是错误的。
说明:
(1) const是函数类型的一部分,在实现部分也要带该关键字。
(2) const关键字可以用于对重载函数的区分。(常对象只能调用常成员函数,注意当出现函数重载时,一个非常对象(一般对象)首先调用非常成员函数,如果不存在重载的非常成员函数,那么它会调用常成员函数)
(3) 常成员函数不能更新类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数。
(4) 常成员函数只能调用常成员函数,而不能调用非常成员函数(那怕这个非常成员函数没有对数据成员进行更改),但是常成员函数可以被非常成员函数调用

任何不修改成员数据的函数都应该声明为const函数,这样有助于提高程序的可读性和可靠性

构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)


    对于某个类的所有对象来说,类成员函数只在内存中有一份拷贝,所有的对象都共享同一份成员函数的代码。同一个类的不同的对象之间的差异仅仅是通过数据成员来体现的。c++实现成员函数的时候实际上用到了一个技巧——this指针。this指针是当前调用成员函数的对象首地址,我们知道通过这个地址可以访问到对应对象的成员变量。那么成员函数如何区分this究竟指向哪个对象呢?技巧就在于,c++背后把成员函数当做普通函数一样调用,除了传入实际的参数外,还把所属对象的指针作为参数this传入,函数内部通过显示的或者隐含的方式访问对象成员(注意如果成员函数的形参与对象的数据成员的变量名一样,那么只能够显式使用this指针来区别形参,以此表示是当前对象的数据成员,否则将引用的是这个成员函数的形参)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值