this指针和常函数

this指针

一.成员变量与成员函数

•相同类型的不同对象各自拥有独立的成员变量实例

•相同类型的不同对象彼此共享同一份成员函数代码

•为相同类型的不同对象所共享 的成员函数,如何区分所访问 的成员变量隶属于哪个对象?

–void User::print (void) 
 { 
    cout << m_name << ", " << m_age << endl; 
 }

–User user1 ("zhangfei", 22); 
 User user2 ("zhaoyun", 20); 
 user1.print (); // zhangfei, 22 
 user2.print (); // zhaoyun, 20

这里写图片描述
这里写图片描述
二.this指针

•类的每个成员函数都有一个隐藏的指针型参数this,指向调用该成员函数的对象,这就是this指针
–void User::print (void) { … }
void _ZN4User5printEv (User* this) { … }

–user1.print (); 
   _ZN4User5printEv (&user1);

•类的构造和析构函数中同样有this指针,指向这个正在被构造或析构的对象

•在类的成员函数、构造函数和析构函数中,对所有成员的访问,都是通过this指针进行的

•事实上,在类的成员函数、构造函数和析构函数中,也可以显式地通过this指针访问该类的成员

三.显式使用this指针

•多数情况下,程序并不需要显式地使用this指针,编译器通过名字解析,可以判断出所访问的标识符是否属于该类的成员,是则为其加上“this->”

•在构造函数内部,除了使用初始化表外,还可以通过this指针,将同名的成员与非成员区分开来

•在类的成员函数中,通过this指针向该成员函数的调用者,返回调用对象的自拷贝或自引用

•将this指针作为函数的参数,从一个对象传递给另一个对象,可以实现对象间的交互

常函数

一.修饰this指针的const

•在类成员函数的形参表之后,函数体之前加上const关键字,该成员函数的this指针即具有常属性,这样的成员函数被称为常函数

•在常函数内部,因为this指针被声明为常量指针,所以无法修改成员变量的值,除非该成员变量被mutable关键字修饰

–class User 
 { 
    ...; 
    mutable unsigned int m_times; 
 };

–void User::print (void) const 
 { 
    cout << m_name << ", " << m_age << endl; m_name = ""; // 编译错误 
    m_age++; // 编译错误 
    ++m_times; 
 }

二.常对象只能调用常函数

•通过常对象调用成员函数,传递给该成员函数this指针参数的实参是一个常量指针

–User user (…); 
 User const* cptr = &user; 
 User const& cref = user;

–void User::modify (void) { ... } 
 void _ZN4User6modifyEv (User* this) { ... } 
 void User::print (void) const { ... } 
 void _ZNK4User5printEv (User const* this) { ... }

–cptr->modify (); // 错误 
    _ZN4User6modifyEv (cptr); 
 cref.print (); _
 ZNK4User5printEv (&cref);

三.常函数与非常函数构成重载

•原型相同的成员函数,常版本和非常版本构成重载

–class Array 
 { 
    int const& at (size_t) const; 
    int& at (size_t i); 
 };

–Array array (...);

•常对象选择常版本
–Array const& cref;
cout << cref.at (0) << endl;

•非常对象选择非常版本
–array.at (0) = 100;

•如果没有非常版本,非常对象也能选择常版本
–cout << array.at (0) << endl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值