目录

4.3 C++对象模型和this指针

4.3.1 成员变量和成员函数分开存储

4.3.2 this指针概念(非常重要)

4.3.3 空指针访问成员函数

4.3.4 const修饰成员函数

相关教程


4.3 C++对象模型和this指针

4.3.1 成员变量和成员函数分开存储

  • 在 C++ 中,类内的成员变量和成员函数分开存储。
  • 只有非静态成员变量才属于类的对象上。

示例:(将 Person 里的成员依次注释,看对象占用的空间大小)

// 成员变量 和 成员函数 是分开存储的
class Person
{int m_A;   // 非静态成员变量 属于类的对象上static int m_B;   // 静态成员变量 不属于类对象上void func() {}// 非静态成员函数 不属于类对象上static void func2() {}// 静态成员函数 不属于类对象上
};void test01 ()
{Person p;// 空对象占用内存空间为: 1// C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存位置// 每个空对象也应该有一个独一无二的内存地址cout << "size of p = " << sizeof(p) << endl;
}int main() {test01();system("pause");return 0;
}
----------------------------------------------------------------------
size of p = 4
请按任意键继续. . .

4.3.2 this指针概念(非常重要)

通过4.3.1我们知道在C++中成员变量和成员函数是分开存储的。

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。

那么问题是:这一块代码是如何区分哪个对象调用自己的呢?

C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象

this指针特性

  • this指针是隐含每一个非静态成员函数内的一种指针。
  • this指针不需要定义,直接使用即可。

this指针的用途

  • 当形参和成员变量同名时,可用this指针来区分。
  • 在类的非静态成员函数中返回对象本身,可使用 return *this。

作用

  • 1. 解决名称冲突。
  • 2. 返回对象本身用 *this

示例:

// 1.解决名称冲突
class Person
{
public:Person(int age){age = age;// this 指针指向 被调用的成员函数 所属的对象//this->age = age;}int age;
};void test01 ()
{Person p(20);cout << "p.age = " << p.age << endl;
}int main() {test01();system("pause");return 0;
}
------------------------------------------------------------------
p.age = -858993460
请按任意键继续. . .
------------------------------------------------------------------
p.age = 20
请按任意键继续. . .

返回对象本身用 *this:(链式编程思想

// 1.解决名称冲突
class Person
{
public:Person(int age){//age = age;// this 指针指向 被调用的成员函数 所属的对象this->age = age;}Person& AddAge(Person& p){this->age += p.age;// this指向p2的指针,而*this指向的就是p2这个对象本体// 返回对象本身return *this;}int age;
};void test01 ()
{Person p1(10);Person p2(20);// 链式编程思想p2.AddAge(p1).AddAge(p1).AddAge(p1);cout << "p2.age = " << p2.age << endl;
}int main() {test01();system("pause");return 0;
}
-------------------------------------------------------------------
p2.age = 50
请按任意键继续. . .

而如果将上面的 引用返回,改为值返回:

  • 引用 返回的是对象本体。
  • 返回的是拷贝后的一份新的对象数据。所以就算链式嵌套,也返回的是嵌套后的新的对象数据。
// 1.解决名称冲突
class Person
{
public:Person(int age){//age = age;// this 指针指向 被调用的成员函数 所属的对象this->age = age;}Person AddAge(Person& p){this->age += p.age;// this指向p2的指针,而*this指向的就是p2这个对象本体// 返回对象本身return *this;}int age;
};void test01 ()
{Person p1(10);Person p2(20);// 链式编程思想p2.AddAge(p1).AddAge(p1).AddAge(p1);cout << "p2.age = " << p2.age << endl;
}int main() {test01();system("pause");return 0;
}
-------------------------------------------------------------------
p2.age = 30
请按任意键继续. . .

4.3.3 空指针访问成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针。

如果用到this指针,需要加以判断保证代码健壮性

示例:

// 空指针调用成员函数
class Person
{
public:void showName(){cout << "this is Person Name" << endl;}void showAge(){// 防止传入指针为空,提高代码健壮性if (this == NULL)return;// 报错原因是因为传入的指针是为NULLcout << "age = " << this->m_age << endl;cout << "age = " << m_age << endl;}int m_age;
};void test01 ()
{Person* p = NULL;//p->showName();p->showAge();
}int main() {test01();system("pause");return 0;
}

4.3.4 const修饰成员函数

常函数

  • 成员函数后加const后,我们称这个函数为常函数
  • 常函数内不可以修改成员属性
  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象

  • 声明对象前加const称该对象为常对象
  • 常对象只能调用常函数

this指针的本质是指针常量,指针的指向是不可以修改的

void func() const  =  const Person * const this

在成员函数后面加 const,修饰的是 this指向,让指针指向的值也不可以修改。

示例:

// 常函数。常函数中不可修改 值
class Person
{
public:// this指针的本质是指针常量,指针的指向是不可以修改的// const Person * const this// 在成员函数后面加 const,修饰的是 this指向,让指针指向的值也不可以修改void showPerson() const{this->m_A = 100;   // this指针不可以修改指针的指向m_A = 100;m_B = 100;}void func(){}int m_A;mutable int m_B; // 特殊变量,即使在常函数中,也可以修改这个值
};void test01 ()
{Person p;p.showPerson();
}// 常对象
void test02()
{const Person p;p.m_A = 100;   // 常对象,不允许修改变量p.m_B = 100;  // m_B是特殊值,在常对象下也可以修改// 常对象只能调用常函数p.showPerson();p.func();
}int main() {test01();system("pause");return 0;
}

相关教程

  • 开发环境搭建:Visual Studio 2019 C++开发环境搭建
  • 推荐视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=4205594350351753444
  • 已投币三连,非常细致的视频教程,感谢up主。

c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象相关推荐

  1. C++ this指针初步使用,与链式编程

    #include "pch.h" #include <iostream> #include <string> using namespace std;cla ...

  2. C++基础08-this指针-const修饰成员函数-函数返回引用/值

    一.this指针 1.C++类对象中的成员变量和成员函数是分开存储的.C语言中的内存四区模型仍然有效! 2.C++中类的普通成员函数都隐式包含一个指向当前对象的this指针. 3.静态成员函数.成员变 ...

  3. C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元

    1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...

  4. C++_类和对象_对象特性_This指针的用途_用来解决名称冲突_*this实现链式编程---C++语言工作笔记049

    然后我们来看c++中的,this的使用,其实,我们知道java中也有this,这个c++中的this和java中的this 差不多.都是用来指代,对象的本身. 还是用代码去看看吧,c++中的this, ...

  5. C语言 const 修饰函数参数 - C语言零基础入门教程

    C语言 const 修饰函数参数 - C语言零基础入门教程 目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面 4.const 修饰在函数 ...

  6. C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 7 指针 7.1 指针的基本概念 7.2 指针变量的定义和使用 示例 7.3 指针所占内存空间 示例 7.4 空指针和野指针 示 ...

  7. 指针05:const修饰指针

    const修饰指针 常量指针 const修饰常量 指针常量 const修饰指针和常量 #include<iostream> using namespace std;int main(){/ ...

  8. C语言 const 修饰指针 - C语言零基础入门教程

    目录 一.const 简介 二.const 修饰指针 1.const int *p 2.int const *p 3.int * const p 4.const int * const p 三.猜你喜 ...

  9. 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)

    黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例) 一.60 指针-const修饰指针 二 ...

最新文章

  1. weblogic服务器部署的程序,如何直接通过IP访问(即URL中去掉工程名)
  2. SpringBoot第二十二篇: 创建含有多module的springboot工程
  3. Java开发者需要了解的移动开发编程语言
  4. Java类加载文章1(z)
  5. P1198 [JSOI2008]最大数
  6. [云炬ThinkPython阅读笔记]2.10 练习
  7. Oracle 计算两个日期间隔的天数、月数和年数
  8. 【error】深度优先搜索TypeError: unhashable type: ‘list‘
  9. 06-图1 列出连通集
  10. C# 序列号和反序列化
  11. 01 按指定格式读写文件出现乱码
  12. adb 静默安装_Android静默安装的实现方案(一)
  13. android java文件_android 项目下文件的作用
  14. 2011-寒假 linux 学习笔记
  15. MATLAB通信系统建模与仿真
  16. MacBook设置快捷键打开终端Terminal
  17. 在useEffect中使用了setState,报错
  18. ZStack基于华芯通打造ARM国产云平台 助力云上贵州多项应用
  19. Spring中同一个service中方法相互调用事务不生效问题解决方案
  20. 物联网专业属于计算机的哪个门类,物联网工程专业属于什么门类

热门文章

  1. Haxe东游记(上)part1.5:roadmap
  2. PyQt4 的事件与信号 -- 发射信号
  3. 微软版UnityVs横空出世,究竟是谁成就了谁?
  4. java多线程知识点总结
  5. linux命令——scp 两台linux机器间文件或目录传输
  6. FCK编辑器去掉html标签
  7. Linux下安装vim
  8. docker內安装TOPT
  9. k-means及变种
  10. 阿里架构师用3点讲透数据中台,这些都是你没看过的