C++学习(10)—— 对象模型和this指针
1. 成员变量和成员函数分开存储
在C++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
- 空对象占用内存空间为1
- C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
#include<iostream>
#include<string>
using namespace std;
//成员变量和成员函数是分开存储的
class Person{
int m_A; //非静态成员变量,属于类的对象上
static int m_B; //静态成员变量,不属于类的对象上
void func(){} //非静态成员函数,不属于类的对象上
static void func(){} //静态成员函数,不属于类的对象上
};
int Person::m_B = 10;
void test01(){
Person p;
//空对象占用内存空间为1
//C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
//每个空对象也应该有一个独一无二的内存地址
cout << "size of p = " << sizeof(p) << endl;
}
void test02(){
Person p;
cout << "size of p = " << sizeof(p) << endl;
}
int main(){
test02();
return 0;
}
2. this指针概念
通过1我们知道了C++中成员变量和成员函数是分开存储的
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
那么问题是:这一块代码是如何区分哪个对象调用的自己呢?
C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
this指针是隐含每一个非静态成员函数的一种指针
this指针不需要定义,直接使用即可
this指针的用途:
- 当形参和成员变量同名时,可用this指针来区分
- 在类的非静态成员函数中返回对象本身,可使用return *this
#include<iostream>
using namespace std;
class Person{
public:
Person(int age){
//this指针指向被调用的成员函数所属的对象
this->age = age;
}
int age;
Person& PersonAddAge(Person &p){
this->age += p.age;
return *this;
}
};
//1. 解决名称冲突
void test01(){
Person p1(18);
cout << "p1的年龄为:" << p1.age << endl;
}
//2. 返回对象本身用*this
void test02(){
Person p1(18);
Person p2(18);
//链式编程思想
p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
cout << "p2的年龄为:" << p2.age << endl;
}
int main(){
test02();
return 0;
}
3. 空指针访问成员函数
C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针
如果用到this指针,需要加以判断保证代码的健壮性
#include<iostream>
using namespace std;
class Person{
public:
void showClassName(){
cout << "this is Person class" << endl;
}
void showPersonAge(){
//错误原因是因为传入的指针是为NULL
if(this == NULL){
return ;
}//预防错误
cout << "age = " << m_age /*this->m_age*/ << endl;
}
int m_age;
};
void test01(){
Person * p = NULL;
p->showClassName();
p->showPersonAge();
}
int main(){
test01();
return 0;
}
4. const修饰成员函数
常函数:
- 成员函数后加const后,我们称这个函数为常函数
- 常函数内不可以修改成员属性
- 成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
- 声明对象前加const称该对象为常对象
- 常对象只能调用常函数
在成员函数后加const,修饰的是this指向,让指针指向的值也不可以修改
#include<iostream>
using namespace std;
class Person{
public:
//this指针的本质是指针常量,指针的指向是不可以修改的
//const Person * const this;
//在成员函数后加const,修饰的是this指向,让指针指向的值也不可以修改
void showPerson() const {
m_b = 100;
m_a = 100;
cout << "this is Person class" << endl;
}
void func(){
}
int m_a;
mutable int m_b; //特殊变量,即使在常函数中,也可以修改这个值,加关键字mutable
};
void test01(){
Person * p = NULL;
p->showClassName();
p->showPersonAge();
}
void test02(){
const Person p;
p.m_a = 100; //不可以修改
p.m_b = 100; //可以修改
p.showPerson(); //可以调用,是因为两个都不可以修改普通成员变量
p.func(); //不可以调用
}
int main(){
test01();
return 0;
}
C++学习(10)—— 对象模型和this指针的更多相关文章
- 学习:类和对象——对象模型和this指针
成员变量和成员函数分开存储: 在C++中,类内的成员变量和成员函数分开存储 第一点:空对象占用内存空间1个字节 第二点:只有非静态成员变量才属于类的对象上,非静态成员函数和静态成员函数和静态成员变量不 ...
- 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概览 client对象模型(CSOM)基础
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型(CSOM)基础 在SP2 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 介绍SP2013中远程APIs
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 介绍SP2013中远程APIs 当SP首次開始 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 JavaScript
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 JavaScript 与托管.NETclien ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 托管代码(.NET)
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 托管代码(.NET) 在SP2010中,微软提 ...
- javascript对象模型和function对象
javascript中,函数就是对象 <html> <head> <script type="text/javascript"> functio ...
- Objective-C的对象模型和runtime机制
内容列表 对象模型(结构定义,类对象.元类和实例对象的关系) 消息传递和转发机制 runtime系统功能理解 对象模型 结构定义 对象(Object): OC中基本构造单元 (building blo ...
随机推荐
- nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
前言一.nginx简介1. 什么是 nginx 和可以做什么事情Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50 ...
- js追加html元素
jquery追加html代码,添加元素 .append() //新增仲裁申请人 $("."+inputName).append("<div class=\" ...
- 记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
记一次查询超时的解决方案The timeout period elapsed...... https://www.cnblogs.com/wyt007/p/9274613.html Exception ...
- SQL告警
SQL很有必要 MySQL性能 最大数据量 最大并发数 查询耗时0.5秒 实施原则 数据表设计 数据类型 避免空值 text类型 索引优化 索引分类 优化原则 SQL优化 分批处理 不做列运算 避 ...
- Android.mk基础
1.前言 Android.mk用于向编译系统描述源文件和共享库,它实际上是编译系统解析一次或多次的微小GNU makefile片段.它的语法支持将源文件分组为模块,模块是静态库.共享库或独立的可执行文 ...
- linux -------------- Linux系统安装jdk
linux 安装软件有三种方式 tar (解压安装 ) rpm (直接安装) yum(在线) 安装主要步邹 1.下载jdk 软件包 2.检测是否安装 查看已安装jdk软件包 rpm -qa|grep ...
- jmeter通过BeanShell,实现对接口参数HmacSHA256加密(转)
jmeter通过BeanShell,实现对接口参数HmacSHA256加密2019-04-29 05:10 ps. 最近抓包网站的登陆请求,发现就2个参数,用户名和密码,通过工具去请求这个接口,一直返 ...
- Sitecore 内容版本设计
Sitecore内容变化的跟踪显着偏离既定规范.了解Sitecore中版本控制和工作流程的细节,该产品是对这些发布工具的回答. 在出版界,实时跟踪内容变化很常见,可能是由于Microsoft Word ...
- HDFS 其他命令---fsck
HDFS 其他命令 HDFS支持fsck命令用以检查各种不一致.fsck用以报告各种文件问题,如 block丢失或缺少block等.fack 命令用法如下: hdfs fsck <path> ...
- 开发dubbo应用程序(二)dubbo注册中心相关概述
1.注册中心概述 在Dubbo微服务体系中,注册中心是其核心组件之一.Dubbo通过注册中心实现了分布式环境中各微服务之间的注册与发现,是各分布式节点之间的纽带.其主要作用如下: 动态加入.一个服 ...