c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象
目录
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修饰成员函数,常函数,常对象相关推荐
- C++ this指针初步使用,与链式编程
#include "pch.h" #include <iostream> #include <string> using namespace std;cla ...
- C++基础08-this指针-const修饰成员函数-函数返回引用/值
一.this指针 1.C++类对象中的成员变量和成员函数是分开存储的.C语言中的内存四区模型仍然有效! 2.C++中类的普通成员函数都隐式包含一个指向当前对象的this指针. 3.静态成员函数.成员变 ...
- C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元
1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...
- C++_类和对象_对象特性_This指针的用途_用来解决名称冲突_*this实现链式编程---C++语言工作笔记049
然后我们来看c++中的,this的使用,其实,我们知道java中也有this,这个c++中的this和java中的this 差不多.都是用来指代,对象的本身. 还是用代码去看看吧,c++中的this, ...
- C语言 const 修饰函数参数 - C语言零基础入门教程
C语言 const 修饰函数参数 - C语言零基础入门教程 目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面 4.const 修饰在函数 ...
- C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】
C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 7 指针 7.1 指针的基本概念 7.2 指针变量的定义和使用 示例 7.3 指针所占内存空间 示例 7.4 空指针和野指针 示 ...
- 指针05:const修饰指针
const修饰指针 常量指针 const修饰常量 指针常量 const修饰指针和常量 #include<iostream> using namespace std;int main(){/ ...
- C语言 const 修饰指针 - C语言零基础入门教程
目录 一.const 简介 二.const 修饰指针 1.const int *p 2.int const *p 3.int * const p 4.const int * const p 三.猜你喜 ...
- 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)
黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例) 一.60 指针-const修饰指针 二 ...
最新文章
- weblogic服务器部署的程序,如何直接通过IP访问(即URL中去掉工程名)
- SpringBoot第二十二篇: 创建含有多module的springboot工程
- Java开发者需要了解的移动开发编程语言
- Java类加载文章1(z)
- P1198 [JSOI2008]最大数
- [云炬ThinkPython阅读笔记]2.10 练习
- Oracle 计算两个日期间隔的天数、月数和年数
- 【error】深度优先搜索TypeError: unhashable type: ‘list‘
- 06-图1 列出连通集
- C# 序列号和反序列化
- 01 按指定格式读写文件出现乱码
- adb 静默安装_Android静默安装的实现方案(一)
- android java文件_android 项目下文件的作用
- 2011-寒假 linux 学习笔记
- MATLAB通信系统建模与仿真
- MacBook设置快捷键打开终端Terminal
- 在useEffect中使用了setState,报错
- ZStack基于华芯通打造ARM国产云平台 助力云上贵州多项应用
- Spring中同一个service中方法相互调用事务不生效问题解决方案
- 物联网专业属于计算机的哪个门类,物联网工程专业属于什么门类