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

在C++中,类内的成员变量和成员函数分开存储

第一点:空对象占用内存空间1个字节

第二点:只有非静态成员变量才属于类的对象上,非静态成员函数静态成员函数静态成员变量不属于类的对象上

示例代码如下:结果为4个字节

#include<iostream>
#include<string> using namespace std; class Person { // 空对象占一个字节
public:
int m_a; // 非静态成员变量 属于类的对象 打印内存空间为四个字节 static int m_b; // 静态成员变量 不属于类的对象 void func() {}// 非静态成员函数 不属于类的对象 static void s_func() {}// 静态成员函数 不属于类的对象
};
int Person::m_b = 1; void test01() {
Person p;
cout << sizeof(p) << endl;
} int main() {
test01();
system("pause");
return 0;
}

this指针概念:

this指针指向被调用的成员函数所属的对象

特点1:this指针是隐含每一个非静态成员函数内的一种指针

特点2:this指针不需要定义,直接使用即可

this指针的用途:

1、当形参和成员变量同名时,可用this指针来区分

2、在类的非静态成员函数中返回对象本身,可使用return *this

示例:

①所指的代码这种输出的数据是错误的,原因就是形参和成员变量同名,编译器就不知道age=age 到底是生成了一个age给age赋值,还是给自身的对象age赋形参的值,所以我们可以通过this指针来解决问题,this指针指向被调用的成员所属的对象

#include<iostream>
#include<string> using namespace std; class Person{
public:
Person(int age) {
//age = age; ①这段错误
this->age = age;
} public:
int age;
}; void test01() {
Person p1(18);
cout << p1.age << endl;
} int main() {
test01();
system("pause");
return 0;
}

第二点:在类的非静态成员函数中返回对象本身,可使用return *this

示例

#include<iostream>
#include<string> using namespace std; class Person{
public:
Person(int age) {
this->age = age;
} Person & addage() {
this->age += 10;
//this指针指向被调用的成员函数所属的对象,那么this指针保存的就是p1的内存地址,那么我们返回*this,那么返回的就是本身p1的本体
return *this;
} public:
int age;
}; void test01() {
Person p1(18);
p1.addage().addage().addage(); // p1.addage()之后本身p1的本体然后继续addage那么就继续+10了
cout << p1.age << endl;
} int main() {
test01();
system("pause");
return 0;
}

拓展:听老师说如果把 Person类中定义的Person & addage()&去掉的话,那么结果会是什么呢?

结果:输出28,那么只加了一次,那么后面的addage都去哪了呢?

答案:当Person addage() 方式是以值传递的方式返回对象,那么就会进行拷贝构造函数,复制一个新的对象返回

记住一点:当&修饰的时候,返回的是本体,当&没用修饰的时候 返回一个新的对象


空指针访问成员函数

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

为什么空指针可以调用成员函数呢?个人理解:根据上文联系理解,成员变量和成员函数是分开的,只有非静态成员变量是对象本身的

#include<iostream>
#include<string> using namespace std; class Person { public: void print_age() { if (this == NULL) { //如果用到this指针,需要加以判断保证代码的健壮性
return;
} cout << this->m_age << endl;
} void print_hello() {
cout << "hello world" << endl;
} public:
int m_age;
}; void test01() {
Person * p = NULL;
p->print_hello();
p->print_age(); //无法访问 } int main() {
test01(); system("pause");
return 0;
}

const修饰成员函数:

常函数:

1、成员函数后加const后我们称为这个函数为常函数

2、常函数内不可以修改成员属性

3、成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:

1、声明对象前加const称该对象为常对象

2、常对象只能调用常函数

示例代码:

#include<iostream>
#include<string> using namespace std; class Person{
public:
Person() {
this->a = 1;
this->b = 2; } void showP() const { //此时如果我们加了const 那么这个showP函数 也成为常函数 原本this是指针常量 ,那么加了const之后也就是const Person * const this ,不能修改地址也不能该能值
//this指针的本质是 指针常量 也就是 Person * const p
//this->a = NULL; //无法运行 因为此时的this是const Person * const this 无法修改指向
this->b = 100; //可以运行,因为b为mutable修饰
cout << b << endl; } public:
int a;
mutable int b; //mutable 修饰为可修改 可变的 }; int main() {
Person p;
p.showP(); system("pause");
return 0;
}

学习:类和对象——对象模型和this指针的更多相关文章

  1. C++学习(10)—— 对象模型和this指针

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

  2. Linux学习-LVS跨网段DR模型和FWM多服务绑定

    一.实验环境 系统:CentOS7.6 主机:5台 (虚拟机) 客户端1台:172.16.236.134/24 (NAT网卡),网关指向 172.16.236.185/24(路由服务器) 路由服务器1 ...

  3. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型(CSOM)基础

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览  client对象模型(CSOM)基础         在SP2 ...

  4. JavaSE 学习笔记02丨对象与类

    Chapter 4. 对象与类 4.1 面向对象程序设计概述 面向对象程序设计(简称OOP),是当今主流程序设计范型.面向对象的程序是由对象组成的,每个对象(来自于标准库或自定义的)包含对用户公开的特 ...

  5. DELPHI学习---类和对象(五篇)

    Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...

  6. Java学习——类与对象

    在学习面向对象之前首先我们要理解一下几点: 什么是面向对象 对象的概念 类 类与对象的关系/区别 什么是对象的属性 什么是对象的方法 什么是面向对象.对象.类 讲到面向对象就不得提到面向过程,早期的计 ...

  7. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 Windows Phone

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 Windows Phone         和.NET托管代码和 ...

  8. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围         本章之前提到过. ...

  9. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 介绍SP2013中远程APIs

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览  介绍SP2013中远程APIs         当SP首次開始 ...

随机推荐

  1. Fineui 实现点击左边树状主菜单链接 打开新窗口或打开多个同一个tab

      原文:http://fineui.com/bbs/forum.php?mod=viewthread&tid=7019&page=1#pid31469     代码如下:   < ...

  2. [Linux] - Manjaro ARM 系统配置(更新镜像源,安装 Docker 和 Dotnet Core)

    硬件:Raspberry Pi 4B系统:Manjaro-ARM-xfce-rpi4-19.08网址:https://manjaro.org/ Issue系统启动后,中文字符显示为小方格乱码 解决:安 ...

  3. Django-06-模板(Template)

    一.模板组成 HTML代码+逻辑控制代码 二.逻辑控制代码 1. 变量 语法格式: {{var_name}} Template和Context对象 D:\python\Project\django_t ...

  4. 深度学习-InfoGAN论文理解笔记

    在弄清楚InfoGAN之前,可以先理解一下变分推断目的以及在概率论中的应用与ELBO是什么,以及KL散度 https://blog.csdn.net/qy20115549/article/detail ...

  5. AJAX调用数据,滚动到底部

    最近一个小项目里面,需要使用AJAX去拉取数据,并且直接显示最后一条信息,也就是滚动到底部.实现脚本如下: var scrollHeight = $('.txtBox3').prop("sc ...

  6. 刨根究底字符编码之十六——Windows记事本的诡异怪事:微软为什么跟联通有仇?(没有BOM,所以被误判为UTF8。“联通”两个汉字的GB内码,其第一第二个字节的起始部分分别是“110”和“10”,,第三第四个字节也分别是“110”和“10”)

    1. 当用一个软件(比如Windows记事本或Notepad++)打开一个文本文件时,它要做的第一件事是确定这个文本文件究竟是使用哪种编码方式保存的,以便于该软件对其正确解码,否则将显示为乱码. 一般 ...

  7. N皇后问题的python实现

    数据结构中常见的问题,最近复习到了,用python做一遍. # 检测(x,y)这个位置是否合法(不会被其他皇后攻击到) def is_attack(queue, x, y): for i in ran ...

  8. 华为、华三 交换机 开启SNMP 简单网络管理协议

    [huawei]snmp-agent //使能SNMP代理 [huawei]snmp-agent sys-info version all //允许所有SNMP 支持 协议 [huawei]snmp- ...

  9. React 语法

    1.JavaScript XML JSX = JavaScript XML,是一个看起来很像 XML 的 JavaScript 语法扩展.JSX 不是模板,是JS语法本身,有更多的扩展.JSX 组件一 ...

  10. SpringbBoot之JPA批量更新

    菜鸟学习,不对之处,还请纠正. 需要批量更新数据库的某些数据,项目使用的是JPA,刚对mybatis熟悉一点,又换成了JPA... 有点懵. 查询了一番之后,发现可以使用 In findByIdIn( ...