学习:类和对象——对象模型和this指针
成员变量和成员函数分开存储:
在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指针的更多相关文章
- C++学习(10)—— 对象模型和this指针
1. 成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用内存空间为1 C++编译器会给每个空对象也分配一个字节空间,是为了区分空对 ...
- Linux学习-LVS跨网段DR模型和FWM多服务绑定
一.实验环境 系统:CentOS7.6 主机:5台 (虚拟机) 客户端1台:172.16.236.134/24 (NAT网卡),网关指向 172.16.236.185/24(路由服务器) 路由服务器1 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型(CSOM)基础
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型(CSOM)基础 在SP2 ...
- JavaSE 学习笔记02丨对象与类
Chapter 4. 对象与类 4.1 面向对象程序设计概述 面向对象程序设计(简称OOP),是当今主流程序设计范型.面向对象的程序是由对象组成的,每个对象(来自于标准库或自定义的)包含对用户公开的特 ...
- DELPHI学习---类和对象(五篇)
Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...
- Java学习——类与对象
在学习面向对象之前首先我们要理解一下几点: 什么是面向对象 对象的概念 类 类与对象的关系/区别 什么是对象的属性 什么是对象的方法 什么是面向对象.对象.类 讲到面向对象就不得提到面向过程,早期的计 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 Windows Phone
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 Windows Phone 和.NET托管代码和 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围 本章之前提到过. ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 介绍SP2013中远程APIs
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 介绍SP2013中远程APIs 当SP首次開始 ...
随机推荐
- day01——python初始、变量、常量、注释、基础数据类型、输入、if
python的历史: 04年Django框架诞生了 内存回收机制是什么(面试题) python2:源码不统一,有重复的功能代码 python3:没有重复的功能代码 python是一个什么的编程语言 编 ...
- STM32学习笔记 —— 1.1 什么是寄存器(概念分析)
问题引入: 用一句话回答以下问题: 什么是寄存器? 什么是寄存器映射? 什么是存储器映射? (本章重点在 1.1.3 和 1.1.4) 1.1 STM32芯片实物图 (图) 学会看丝印图 芯片型号.内 ...
- matlab界面UI设计资料
一个实现图像灰度处理并归类于某已知相似图片的程序 软件:matlab2017a 算法:HU检索图像算法.Zernike算法 资料: ①: matlab遍历文件夹下所有图片和遍历所有子文件夹下图片 - ...
- 已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin'
vue+springboot项目 前端发送请求微信 URL:http:/.........(企业微信的路径) 请求成功,数据发送过去可以接收到,处理完毕后发送返回值给我 我这边前端网络响应处可以看到返 ...
- [SOJ #498]隔膜(2019-10-30考试)/[POJ2152]Fire
题目大意:有一棵$n$个点的带边权树,第$i$个点有两个值$w_i,d_i$,表示在这个点做标记的代价为$w_i$,且这个点距离$d_i$以内至少要有一个点被标记,为最小代价.$n\leqslant6 ...
- H5页面跳转与传值
页面之间的跳转经常使用a标签,使用mvc框架的都是通过访问controller的请求方法,返回请求页面.但本次开发,前端与后台完全分离,前端APP使用HBuider来开发,后台数据就无法使用mvc框架 ...
- C# vb .net实现拉伸效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的拉伸效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- Ole操作帮助类
/// <summary> /// Ole操作类 /// </summary> public class OleDataBaseHandle { private static ...
- Tomcat6项目移到Tomcat7 提示 404 解决方案
一个项目在Tomcat6可以运行和正常访问,但是一部署到Tomcat7就提示404错误.那么可以通过以下方法解决: 找到项目下面的 WEB-INF 文件夹 用记事本打开 WEB.XML 找 ...
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...