深入理解c++常成员函数和常对象

所属分类: 软件编程 / C 语言 阅读数: 42
收藏 0 赞 0 分享

先明确几个概念:

1. 常对象只能调用常成员函数。

2. 普通对象可以调用全部成员函数。

3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。

4. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。

5. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;

在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);

6. 由于this并不是一个常规变量,所以,不能取得this的地址。

如:

#include <iostream>

class A
{
public:
	A():mValue(0)
	{

	}
	void print() 
	{
		std::cout<<"hello";
	}
	int GetValue()
	{
		return mValue;
	}
	int GetValue()const
	{
		return mValue;
	}

private:
	int mValue;
};

void test(A & const a)
{

}

int main()
{
	
	const A a;//const A* const this ;	
	a.print(); //错误,将会提示 error C2662: “A::print”: 不能将“this”指针从“const A”转换为“A &”

	test(a); //error C2664: “test”: 不能将参数 1 从“const A”转换为“A &”
}

由于a是const对象,所以a只能调用类A中的常成员函数。

那么为什么会提示:“不能将this指针.......”的语句呢?

因为对于c++的成员函数(当然不是静态成员函数),都会含有一个隐藏的参数,对于上例A中的int GetValue()函数,在编译后会变成:

int GetValue(A * const this);  //不能修改this变量,但可以修改this指向的内容,即:this是常量指针。

而对于int GetValue()const ,编译后是:

int GetValue(const A* const this);

只所以this指针是const类型,因为在某次调用整个过程this指向都不允许改变(原因很简单,如果改变的话就不是这个对象调用的了)

从编译后的结果看就很清楚了, 因为a是const,所以其this指针就对应: const A* const this ;

而print函数被编译出来后对应的是void print(A* const this); 在进行参数匹配时, 所以就会提示 “不能将“this”指针从“const A ....."

this指针的出现就解释了,所有类A的对象都是公用一套代码模版,为什么各个对象在调用成员函数的时候不会乱套。

原来C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下,this指针是隐含存在的,也可以将其显示的表示出来(即如上例中的 this->mValue。不过this指针只能在类中使用)

还有就是  this指针是一个const指针,不能再程序中修改它或给它赋值;

以上这篇深入理解c++常成员函数和常对象就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C++广播通信实例

这篇文章主要介绍了C++实现广播通信的方法,实例讲述了C++ socket广播通信的原理与实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

C++计算ICMP头的校验和实例

这篇文章主要介绍了C++计算ICMP头的校验和的方法,代码简单实用,对于校验ICMP报文来说有不错的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++设置超时时间的简单实现方法

这篇文章主要介绍了C++设置超时时间的简单实现方法,涉及系统函数setsockopt对套接口的操作,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现ping程序实例

这篇文章主要介绍了C++实现ping程序实例,涉及C++对于ICMP数据包的发送与回显处理,具有一定的实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之boost::array的用法

这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C++之Boost::array用法简介

这篇文章主要介绍了C++之Boost::array用法简介,较为详细的分析了Boost::array中的常见用法,并用实例的形式予以总结归纳,需要的朋友可以参考下
收藏 0 赞 0 分享

VC文件目录常见操作实例汇总

这篇文章主要介绍了VC文件目录常见操作实例汇总,总结了VC针对文件目录的各种常用操作,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

VC打印word,excel文本文件的方法

这篇文章主要介绍了VC打印word,excel文本文件的方法,是VC操作文本文件中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC++获得当前进程运行目录的方法

这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中SendMessage和PostMessage的区别

这篇文章主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多