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. (转)在Source Insight中看Python代码

    http://blog.csdn.net/lvming404/archive/2009/03/18/4000394.aspx SI是个很强大的代码查看修改工具,以前用来看C,C++都是相当happy的 ...

  2. ncurse 笔记

    初始化与结束 为了使用 NCURSES 库,你应该 #include <curses.h>,在编译时,应该加上 -lncurses. stdscr 一般地,第一个函数调用必须是 inits ...

  3. Soldier and Number Game-素数筛

    Two soldiers are playing a game. At the beginning first of them chooses a positive integer n and giv ...

  4. 剑指offer——30包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).   题解: 借助辅助栈,新的数据<=f辅助栈顶时,就压入辅助栈,这样,就能保证辅 ...

  5. Win7+Ubuntu11.10(EasyBCD硬盘安装)----转载

    Win7+Ubuntu11.10(EasyBCD硬盘安装) ubuntu 下载地址:http://mirrors.163.com/ubuntu-releases/12.04/ 1)首先还是分区,在计算 ...

  6. web前端好书推荐 CSS权威指南《第3版,Bootstrap实战,精通CSS 高级Web标准解决方案 第2版 中文

    在我的新博客中==> http://www.suanliutudousi.com/2017/08/24/web%E5%89%8D%E7%AB%AF%E5%A5%BD%E4%B9%A6%E6%8E ...

  7. grep 的一些常用用法

    打印匹配到的上下5行 grep -C 5 'root' /etc/passwd            上下5行 grep -A 5 'root' /etc/passwd            afte ...

  8. python初探爬虫

    python爬虫初探 爬取前50名豆瓣电影: 废话少说,直接上代码! import re​import requestsfrom bs4 import BeautifulSoup​def get_co ...

  9. 使用kubeadm安装kubernetes 1.15

    1.主机准备篇 使用vmware Workstation 10创建一台虚拟机,配置为2C/2G/50G,操作系统为CentOS Linux release 7.6.1810 (Core). IP地址为 ...

  10. Lunascape:将FireFox、Safari和IE合为一体的浏览器

    转自:http://blog.bingo929.com/lunascape-firefox-safari-ie-all-in-one.html 作为前端开发/网页设计师,电脑中总是安装着各种不同内核渲 ...