1. 成员变量和成员函数分开存储

  • 在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上
  • 空对象占用内存空间为:1 ————> C++编译器会给每个空对象也分配一个字节空间,为了区分对象占用内存的位置,也就是说每个空对象应该有一个独一无二的内存地址
#include <iostream>
using namespace std; //成员变量和成员函数分开存储
class Person
{
public:
int m_a;//非静态成员变量,属于类的对象上
static int m_b;//静态成员函数,不属于类对象
void func(){}//非静态成员函数,不属于类的对象上
void func2(){}//静态成员函数,不属于类的对象上
};
void test01() //当类中为空时
{
Person p;
//空对象占用内存空间为:1
//原因:C++编译器会给每个空对象也分配一个字节空间,为了区分对象占用内存的位置,也就是说每个空对象应该有一个独一无二的内存地址
cout << "size of p:"<< sizeof(p) << endl;
}
void test02() //当类中为非空时
{
Person p;
//空对象占用内存空间为:4
cout << "size of p:"<< sizeof(p) << endl;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}

2. this 指针

C++ 通过this 指针来解决非静态成员函数只有一份函数,且在被多个类型相同的对象调用时无法区分的问题 ————> 静态成员函数只能访问静态成员变量,不能访问非静态成员函数变量(无法区分到底是哪个对象上的数据)



this 指针作用

  • this 指针指向被调用的成员函数所属的对象
  • this 指针是隐含每一个非静态成员函数内的一种指针
  • this 指针不需要定义,直接使用。



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



    注:在以值方式返回局部对象时会调用拷贝构造函数
#include <iostream>
using namespace std;
class Person
{
public:
Person(int age)//形参与成员变量同名
{
this -> age = age; //this 指针指向被调用的成员函数所属的对象
}
Person& Personaddage(Person &p) //用引用的方式返回,一直返回test02中的p2;如果用值返回,每次返回都是一个新的对象
{
this -> age+=p.age;
return *this; //this 是指向所调用对象本身
}
int age;
};
//1. 解决名称冲突
void test01()
{
Person p1(18);
cout << "p1的年龄" << p1.age << endl;
} // 2. 返回对象本身用 *this
void test02()
{
Person p1(10);
Person p2(10);
//链式编程思想 //用引用返回为40,值返回为20;由于值传递返回会调用拷贝构造函数,故每次返回都是一个新的对象
p2.Personaddage(p1).Personaddage(p1).Personaddage(p1);
cout << "p2的年龄为:" << p2.age << endl; //由于输出的是 p2 的年龄,所以值返回为20。
} int main()
{
test01();
test02();
system("pause");
return 0;
}

3. 空指针访问成员函数

C++ 中空指针也是可以调用成员函数的,但是要注意有没有用到this指针,如果用到this 指针,需要加以判断保证代码的健壮性

#include <iostream>
using namespace std;
//空指针调用成员含数
class Person
{
public:
void showclassname()
{
cout << "this is Person class" <<endl;
}
void showpersonage()
{ if (this == NULL)
{
return;
}
cout << "age=" << this->m_age <<endl;//如果没有上面 if 语句会报错,报错原因:是因为传入的指针是NULL
}
int m_age;
};
void test01()
{
Person *p =NULL;
p -> showclassname();
p -> showpersonage();
}

10. C++对象模型和 this 指针的更多相关文章

  1. C Primer Plus_第10章_数组和指针_编程练习

    1. /*rain.c 针对若干年的降水量数据,计算年降水总量.年降水平均量,以及月降水平均量*/ #include <stdio.h> #define MONTHS 12 #define ...

  2. GO学习-(10) Go语言基础之指针

    Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 任何程序数 ...

  3. 【C语言学习】《C Primer Plus》第10章 数组和指针

    学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...

  4. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  5. 黑马程序员——C语言基础 指针

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)指针 首先指针是C语言中非常重要的数据类型,如果你说C语言中除了指针 ...

  6. C语言之数组,字符串,指针

    一. 数组的定义 1.  数组初始化 初始化方式 int a[3] = {10, 9, 6}; int a[3] = {10,9}; int a[] = {11, 7, 6}; int a[4] = ...

  7. 第10章 同步设备I/O和异步设备I/O(1)_常见设备及CreateFile函数

    10.1 打开和关闭设备 10.1.1 设备的定义——在Windows中可以与之进行通信的任何东西. (1)常见设备及用途 设备 用途 用来打开设备的函数 文件 永久存储任何数据 CreateFile ...

  8. C语言指针学习(续)

    五.数组和指针的关系 int array[10] = {0,1,2,3,4,5,6,7,8,9},value; ... ... value = array[0];//也可以写成 value = *ar ...

  9. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

随机推荐

  1. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  2. 《Eroico》关卡与操作设计

    操作设计: 没有给明操作教程,操作全靠蒙,只有改建的位置可以看到. 但游戏的难度并没有给玩家适应操作感,随着难度提升怪物血量增厚,但怪物并没有僵直英雄却有僵直.第一个小猫妖便给了玩家一个痛击. 方向键 ...

  3. 【杂记】CSP-S 2020 游记 &反思

    考场经历 吐槽:为什么这个 Enter 的位置怎么诡异啊老是打错.要是考挂了就怪你 开场当然先看了 T1,发现是个日期转换,果然是个百出不厌的模拟题类型,估价细节多到爆炸.看了几分钟题目,对这些规则云 ...

  4. 【学习笔记】K 短路问题详解

    \(k\) 短路问题简介 所谓"\(k\) 短路"问题,即给定一张 \(n\) 个点,\(m\) 条边的有向图,给定起点 \(s\) 和终点 \(t\),求出所有 \(s\to t ...

  5. Java-web-多个独立项目之间相互调用实践

    本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...

  6. uniapp保存图片到本地(APP和微信小程序端)

    uniapp实现app端和微信小程序端图片保存到本地,其它平台未测过,原理类似. 微信小程序端主要是权限需要使用button的开放能力来反复调起,代码如下: 首先是条件编译两个平台的按钮组件: < ...

  7. GitLab的基本了解和使用

    使用前提 GitLab账号 安装好git VSCODE && 配置GitPath 在vscode里配置GitPath file-preferences-setting 在search ...

  8. C#9.0新特性详解系列之六:增强的模式匹配

    自C#7.0以来,模式匹配就作为C#的一项重要的新特性在不断地演化,这个借鉴于其小弟F#的函数式编程的概念,使得C#的本领越来越多,C#9.0就对模式匹配这一功能做了进一步的增强. 为了更为深入和全面 ...

  9. MySQL 锁(完整版)

    目录 锁总览 锁的作用 加锁流程 锁对数据库的影响 锁等待 死锁 锁类型 锁范围 锁方式 全局锁 全局读锁 全局QC锁 QC锁存在的问题: 备份锁 backup lock MDL锁 MDL锁类型 MD ...

  10. idea 中使用Mybatis Generator逆向工程生成代码

    通过MAVEN完成 Mybatis 逆向工程 1. POM文件中添加插件 在 pom 文件的build 标签中 添加 plugin 插件和 数据库连接 jdbc 的依赖. <build> ...