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指针/常函数、常对象的更多相关文章

  1. C++_向函数传递对象

    向函数传递对象 1. 使用对象作为函数参数 对象可以作为参数传递给函数,其方法与传递其他类型的数据相同. 在向函数传递对象时,是通过传值调用传递给函数的. 因此,函数中对对象的任何修改均不影响调用该函 ...

  2. C++中常函数内部的this指针也是const类型的

    代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译 // 读取连接信息 void ThirdWizardPage::ReadConnection() { QFile f ...

  3. C++中指向对象的常指针和指向常对象的指针

    指向对象的常指针 将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变. Time t1(10,12,15),t2; Time * const ptr1=&am ...

  4. 构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)

    十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...

  5. python面试总结2(函数常考题和异常处理)

    python函数常考题 可变类型为参数 不能类型为参数 python如何传递参数 传递值还是引用呢?都不是.唯一支持的参数传递是共享穿参 Call by Object(Call by Object R ...

  6. C++:向函数传递对象(对象、对象指针、对象引用)

    3.5.1   使用对象作为函数参数,其方法与传递基本类型的变量相同 //例3.21 使用对象作为函数参数 #include<iostream> using namespace std; ...

  7. C++中的函数指针和函数对象总结

    篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. ...

  8. c++入门之函数指针和函数对象

    函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性.函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a, ...

  9. c++学习之初话 函数指针和函数对象 的因缘

    函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性. 函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a ...

随机推荐

  1. chomp

    用来除去最后的换行等空白字符. 例程: #!/usr/bin/perl #chomp.pl use warnings; use strict; print "Input a string & ...

  2. CentOS7 相关配置

    nginx 1.在线安装nginx yum install nginx 2.启动nginx服务 systemctl start nginx 3.防火墙设置 打开http防火墙:firewall-cmd ...

  3. python学习1-字符串数字基本运算以及if条件和while循环

    python学习1-字符串数字基本运算以及if条件和while循环 字符串表达形式共四种: name = "string" name = 'string' name = " ...

  4. 11-python基础—格式化的两种方式

    一.使用% %s 字符串 %c 字符 %d 十进制(整数) %i 整数 %u 无符号整数 %o 八进制整数 %x 十六进制整数 %X 十六进制整数大写 %e 浮点数格式1 %E 浮点数格式2 %f 浮 ...

  5. DIV+CSS网页布局常用的一些基础知识

    CSS命名规范 一.文件命名规范 全局样式:global.css:框架布局:layout.css:字体样式:font.css:链接样式:link.css:打印样式:print.css: 二.常用类/I ...

  6. SHELL脚本中执行SQL语句操作MYSQL的5种方法

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  7. nginx反向代理时有无”/”的辨析

    nginx反向代理是日常使用nginx时最常用到的功能之一.在配置url的过程中,“/”的有无经常是影响我们配置成功的关键,也是困扰我们的问题所在.在此,结合实际例子,作简要辨析. 场景一:利用根目录 ...

  8. 跨域问题The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by t

    withCredentials 属性 上面说到,CORS请求默认不发送Cookie和HTTP认证信息.如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow- ...

  9. 正则表达式 判断内容是否为合法的url

    var strUrl= "^((https|http|ftp|rtsp|mms)?://)" + "?(([0-9a-z_!~*'().&=+$%-]+: )?[ ...

  10. 数据库连接JDBC

    #=======================mysql============================= #jdbc.driverClassName=com.mysql.jdbc.Driv ...