c++ 常成员函数 和 常对象
版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/zhuyingqingfen/article/details/31751111
先明白几个概念:
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指向都不同意改变(原因非常easy。假设改变的话就不是这个对象调用的了)
从编译后的结果看就非常清楚了。 由于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++中的常成员函数
代码: #include <iostream> using namespace std; class A{ public: void func1(){ cout<<" ...
- C++(三十二) — 常对象、常成员变量、常成员函数
常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...
- C++类的常成员函数
让一个成员函数带上常量性是什么意思呢?通常的答案是,一个常成员函数不会更改其class对象.这是一种平凡的表述,而编译器实现的手法也相当平凡. 任何非静态成员函数其实都被编译器隐式插入了一个指针类型的 ...
- C++,常成员函数
#include <iostream> using namespace std; class Test { public: int x; int y; void const_m1() co ...
- C++点滴----关于类常成员函数
关于C++中,类的常成员函数 声明样式为: 返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const ...
- C++如何显式调用常成员函数
C++的常成员函数与同名成员函数重载时,该如何显式调用常成员函数? 具体的一个小例子: #include <iostream> using namespace std; class C1 ...
- 【转】C++ const成员变量和成员函数(常成员函数)
转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...
- C++ const成员变量和成员函数(常成员函数)
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只 ...
- C++ const常量对象、常量成员函数和常引用
01 常量对象 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字 class CTest { public: void SetValue() {} private: int ...
随机推荐
- Java基础系列--ArrayList集合
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...
- SpringBoot(2) Json框架 -- Jackson返回结果处理
一.常用框架 阿里 fastjson,谷歌gson等 JavaBean序列化为Json,性能:Jackson > FastJson > Gson > Json-lib 同个结构 Ja ...
- [JZOJ5970] Space
Description 在一个四维空间中,给 \(4\) 个 \(n\) 的排列 \(A,B,C,D\),对于点 \((x,y,z,w)\) ,到点 \((A_x,B_y,C_z,D_w)\) 的花费 ...
- C#基础知识回顾-- 属性与字段
今天在公交车上,突然想属性和字段到底有什么区别?很多字段属性都存在 get{}和set{} 和普通的变量没什么区别(可读可写) 我就感觉属性就是给字段一个多的选择方式,有的字段是不允许更改的.. 刚写 ...
- Jquery的ID选择器
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></scri ...
- NPOI 通过excel模板写入数据并导出
private void ToExcel(string id) { //模板文件 string TempletFileName = Server.MapPath("template.xls& ...
- 数据库和ado连接语句的使用总结
基本的sql语句 创建数据库:CREATE DATABASE database-name 删除数据库:drop database dbname 创建表:create table tabname(字段属 ...
- html页面字体相关
<!doctype html> <html> <head> <meta charset="utf-8"/> <title> ...
- C#特性:ConditionalAttribute
ConditionalAttribute类 msdn解释: 指示编译器应忽略方法调用或属性,除非已定义指定的条件编译符号. 命名空间: System.Diagnostics 语法: // // 摘要: ...
- 《Inside C#》笔记(十三) 多线程 下
一 任务调度 当一个线程的时间片被用尽后,处理器会切换到另一个线程,但关于如何确定执行哪一个线程呢,这就涉及到了线程或任务的优先级. a) 每个线程都有优先级,任务调度算法会根据各线程的不同优先级来决 ...