this指针/常函数、常对象
this指针引入
类中对象的成员变量和成员函数是分开存储的,sizeof(空class) = 1,另外示例中涉及到字节对齐的问题,double本身的字节为8,int为4,由于字节对齐,int也为8,所以最终字节数为16
class Person{
int m; //非静态成员变量,属于对象 sizeof(Person) = 4
static int n; //静态成员变量,不属于对象 sizeof(Person) = 4
static void func(); //静态成员函数,不属于对象 sizeof(Person) = 4
void func01(); //非静态成员函数,不属于对象 sizeof(Person) = 4
double p; //sizeof(Person) = 16 字节对齐 #pragma pack(1)可以取消字节对齐
};
void test01(){
cout << "sizeof(Person) = " << sizeof(Person) << endl;
}
非静态成员变量才属于对象本身,静态成员变量、函数、非静态成员函数(非内联)不属于对象本身。

每一个非内联成员函数只会诞生一份函数实例,多个同类型对象会共用一块代码,由于类中每个实例后的对象都有独一无二的地址,因此不同的实例对象调用成员函数时,函数需要知道是谁在调用它,因此引入了this指针。
this指针原理
主要作用:为了区分不同的实例对象;解决命名冲突。
this指针是隐含在对象成员函数内的一种指针。当一个对象被创建后,它的每一个成员函数都会含有一个系统自动生成的隐含指针this。this指针指向被调用的成员函数所属的对象(谁调用成员函数,this指向谁),*this表示对象本身,非静态成员函数中才有this,静态成员函数内部没有。
class Person{
public:
static int m_B;
int m_A;
Person(int tmp){
m_A = tmp;
}
void test(){
m_A = ;
}
static void test01(){
m_B = ;
}
};
void Class_test(){
int m = ;
Person p(m);
}
编译器对上述代码进行如下处理,对非静态成员函数默认添加了this指针,类型为class *cosnt this
struct Person{
static int m_B;
int m_A;
};
void Person_Ini(Person *const this, int tmp){ //添加了this指针
this->m_A = tmp;
}
void Person_test(Person *const this){
this->m_A = ;
}
static void Person_test01(){
m_B = ;
}
void Person_Class_test(){
int m = ;
Person p;
Person_Ini(&p, m);
}
this指针使用
一般多用于:(1)当形参与成员变量名相同时,用this指针来区分;(2)在类的非静态成员函数中返回对象本身,可以用return *this,this指向对象,*this表示对象本身。
class Person{
public:
int m_A;
Person(int m_A){
this->m_A = m_A; //为了区分形参和成员变量同名
}
//PPlus返回对象可以实现链式编程,如果没引用则返回的是this指向对象的拷贝
Person& PPlus(Person p){
this->m_A += p.m_A;
return *this; //返回对象
}
};
void test01(){
int m = ;
Person p1(m);
Person p2(m);
//---------
//
p1.PPlus(p1).PPlus(p1);
//---------
//---------
//40
//p1.PPlus(p1);
//p1.PPlus(p1);
//---------
cout << p1.m_A << endl;
}
空指针访问成员函数
注意:(1)如果成员函数没有用到this,则空指针可以直接访问;(2)若成员函数用到了this,则可以加if判断,如果this为NULL,则直接return掉。
常函数、常对象
void func() const //常函数 const Person p2; //常对象
常函数修饰的是this指针,不允许修改this指针指向的值,如果执意要修改常函数,可以在成员属性前加mutable。
常对象不允许修改属性,不可以调用普通成员函数,可以调用常函数。
class Person{
public:
int m_a;
mutable int m_b;
void test() const{
//this->m_a = 100; //加了const表示常函数,不可修改this指向的值,其实也是成员属性
this->m_b = ; //加了mutable,可以修改
}
void test02() {
this->m_a = ; //
this->m_b = ; //加了mutable,可以修改
}
};
void test01(){
const Person p;
//p.m_a = 10; //常对象,不可修改属性值
p.test();
//p.test02(); //不可调用普通函数
}
this指针/常函数、常对象的更多相关文章
- C++_向函数传递对象
向函数传递对象 1. 使用对象作为函数参数 对象可以作为参数传递给函数,其方法与传递其他类型的数据相同. 在向函数传递对象时,是通过传值调用传递给函数的. 因此,函数中对对象的任何修改均不影响调用该函 ...
- C++中常函数内部的this指针也是const类型的
代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译 // 读取连接信息 void ThirdWizardPage::ReadConnection() { QFile f ...
- C++中指向对象的常指针和指向常对象的指针
指向对象的常指针 将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变. Time t1(10,12,15),t2; Time * const ptr1=&am ...
- 构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)
十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...
- python面试总结2(函数常考题和异常处理)
python函数常考题 可变类型为参数 不能类型为参数 python如何传递参数 传递值还是引用呢?都不是.唯一支持的参数传递是共享穿参 Call by Object(Call by Object R ...
- C++:向函数传递对象(对象、对象指针、对象引用)
3.5.1 使用对象作为函数参数,其方法与传递基本类型的变量相同 //例3.21 使用对象作为函数参数 #include<iostream> using namespace std; ...
- C++中的函数指针和函数对象总结
篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. ...
- c++入门之函数指针和函数对象
函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性.函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a, ...
- c++学习之初话 函数指针和函数对象 的因缘
函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性. 函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a ...
随机推荐
- git相关操作。
之前只会用图形端的GIT中,命令行的比较陌生,整理下,供自己以后参考 关键的名词: 工作区:工作区 Index / Stage:暂存区 仓库:仓库区(或本地仓库) 远程控制:远程仓库 到项目目录下gi ...
- ncurse 笔记
初始化与结束 为了使用 NCURSES 库,你应该 #include <curses.h>,在编译时,应该加上 -lncurses. stdscr 一般地,第一个函数调用必须是 inits ...
- 了解Metasploit中的Payloads(有效载荷)
什么是payload? payload又称为攻击载荷,主要是用来建立目标机与攻击机稳定连接的,可返回shell,也可以进行程序注入等.也有人把payloads称 为shellcode. Shellco ...
- Xtrabackup 热备
Xtrabackup介绍Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁):m ...
- adb shell 查看内存信息
1.根据包名来查看指定的APP指定数据adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数据没有参数名,可以参考这个命令来看:adb shel ...
- Mysql优化-索引
1. 索引的本质 MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构. 数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度尽可能的快,因此 数据库系统的设计者会从查询算 ...
- cmd命令符
运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) CMD命令锦集 1. gpedit.msc-----组策略 2. ...
- android studio toolbar遮挡住下面控件内容
只需要在该控件布局(content_***.xml)加入: app:layout_behavior="@string/appbar_scrolling_view_behavior" ...
- soj115 御坂网络
题意:平面上有n个A发射点和m个B发射点,可以选择安置相应A/B装置,装置范围是圆,自取半径(要求都相同且<=Rmax).异种要求范围不相交.求装置范围之和(不是并!). 标程: #includ ...
- fiddler突然间抓不到包了
1.一直使用fiddler抓包,但是近几天fiddler突然间抓不到过滤地址的包了. 2.重装fiddler,未能解决. 3.设置取消浏览器的代理,未能解决. 4.关闭杀毒软件,未能解决. 5.换了火 ...