【C++学习】类和对象--对象特性(2)
静态成员
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。
静态成员变量:
所有对象共享同一份数据
在编译阶段分配内存
类内声明,类外初始化
静态成员函数:
所有对象共享同一个函数
静态成员函数只能访问静态成员变量
类内声明,类外初始化
#include<iostream>
using namespace std;
class person
{//1.所有对象共享同一份数据//2.在编译阶段分配内存//3.类内声明,类外初始化
public:static int m_A;
};
void test()
{person p;cout << p.m_A << endl;
}
int main()
{test();system("pause");return 0;
}
会报错:
需要在类外声明:
int person::m_A = 100;
静态成员变量 不属于某个对象上,所有对象都共享同一份文件
因此静态成员变量有两种访问方式
//1.通过对象进行访问
person p;
cout << p.m_A << endl;
(只有静态成员能使用 方式2 访问)
//2.通过类名进行访问
cout<<person::m_A<<endl;
静态成员函数
//1.所有对象共享同一个函数
//2.静态成员函数只能访问静态成员变量
访问方式
//1.通过对象访问person p;p.func();//2.通过类名访问person::func();
对这里能通过类名访问的理解:
因为静态成员函数不属于某一个对象上面,大家共享同一个。无需创建对象就可以访问。
对象模型
成员变量和成员函数分开存储。
只有非静态成员变量才属于类的对象。
空对象占用内存空间为1。
C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置,每个空对象也应有一个独一无二的内存地址。
this指针
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,
那么,如何区分哪个对象调用自己的呢?
C++通过提供特殊的对象指针,this指针,解决上述问题,this指针指向被调用的成员函数所属的对象。(this指针被每一个非静态成员函数隐含,this指针无需定义,直接使用即可)
用途:
1.解决名称冲突
class person
{
public:person(int age){this->age = age;}int age;
};
2.返回对象本身
class person
{
public:person(int age){this->age = age;}person& personaddage(person &p){this->age += p.age;return *this;}int age;
};
void test()
{person p1(10);person p2(10);p2.personaddage(p1).personaddage(p1).personaddage(p1);//链式编程思想cout << p2.age << endl;
}
空指针调用成员函数
C++允许空指针调用成员函数
#include<iostream>
using namespace std;
class person
{
public:void showname(){cout << "person类" << endl;}void showage(){cout << m_age << endl;//默认this->m_age,但这里this是空指针,所以出现问题}int m_age;
};void test()
{person* p=NULL;p->showname();p->showage();//这里会出错
}
int main()
{test();system("pause");return 0;
}
解决办法:
void showage(){if (this == NULL){return;}cout << m_age << endl;}
const修饰成员函数
常函数:(成员函数后加const后,称为常函数)
常函数内不可以修改成员属性
成员属性声明时加关键字mutable后,在常函数中依然可以修改。
m_a=100;//相当于this->m_a=100
this指针的本质是指针常量,指针的指向不可修改 (person*const this)
const person*const this
在成员函数后面加const ,修饰的是this指向,让指针指向的值也不可修改
加了mutable之后即使是在常函数里也可以修改。
常对象:(声明函数前加const后,称为常对象)
常对象只能调用常函数。
总结:
常函数/常属性 让成员属性 不可修改,加了mutable关键字就可以了。
【C++学习】类和对象--对象特性(2)相关推荐
- python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)
python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...
- scala学习-类与对象
类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: 1 class Counter{ 2 private var va ...
- java学习---类与对象
java学习心得3 文章目录 java学习心得3 类 对象 关键字this 总结与反思 类 一 定义一个Java的类 属性 : 将数据存储在变量中 1成员变量 使用成员变量:对象名.变量名 使用成员方 ...
- java学习--类与对象
文章目录 java学习--类与对象 类的定义与对象的使用 类的私有成员的使用 java学习–类与对象 类的定义与对象的使用 类的定义与对象的使用 类的定义步骤: public 类名: //定义成员变量 ...
- 类和对象的特性(C++谭浩强第三版笔记)
0.0 从程序结构上看: 基于过程的程序中:围绕功能进行的,函数是构成程序的基本部分,程序面对的是一个个函数. 面向对象的程序中:除主函数外,其他函数基本上都出现在"类"中 ...
- 学习集合工具类CollectionUtils——List对象案例
学习集合工具类CollectionUtils--List对象案例 一.依赖 二.案例 三.结果展示 一.依赖 <dependency><groupId>org.apache.c ...
- C++入门学习 类与对象
类与对象 普通大一新生,C++入门.老师上课不讲课只看视频讲解,效率低.临近期末总结巩固已经学习过的内容. 一.构造函数 定义 类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数-> ...
- Python编程语言学习:python语言中快速查询python自带模块函数的用法及其属性方法、如何查询某个函数关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略
Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法.如何查询某个函数&关键词的用法.输出一个类或者实例化对象的所有属性和方法名之详细攻略 ...
- Java学习 --- 类与对象
目录 一.问题需求 二.类与对象关系图 三.类与对象的关系 四.什么是类 五.什么是对象 六.对象的内存分布图 一.问题需求 有两只猫,第一只叫小白,年龄:1岁,颜色:白色,第二只叫小黑,年龄:2岁, ...
- Java 学习 类与对象讲解
类与对象的概念 : 什么是类 什么是对象 类与对象指的是一种编程思想,其中类是类别的概念,对象是这个类别中一个具体的个例 比如: 学生类对应 某一名具体的学生 计算机类 对应我正在使用的这台计算机 ...
最新文章
- 算法----摆动序列
- 清华大学 唐杰 计算机学院 怎么样,我国首位原创虚拟学生,后期希望“她”能够像人一样进行创新...
- Jmeter之控制线程执行到某个结果时退出执行(第二种解决方案)
- QT中树控件QTreeView开发实例
- java多线程--多线程基础小结
- Qt程式异常崩溃处理技巧(Win)
- sql 日期类型空值等于 1900-01-01
- A way to visualize mip levels
- DIV 内滚动条 样式的写法
- linux ansys内存不够,ANSYS 硬件配置建议
- Unity模型制作导出规范
- 2022年营收增长高达70%,智云健康“医院为先”战略成效持续凸显
- python小白系列2
- CentOS7.6安装图形界面失败,startx执行失败
- educoder/python第1关:学习-Python集合之应用一
- 工欲善其事必先利其器 之 DockerDesktop(下)
- 201621123031 《Java程序设计》第11周学习总结
- 我见过最通俗易懂的快速排序过程讲解,转自《坐在马桶上看算法:快速排序》
- spring boot2.X word转pdf
- [Drools]JAVA规则引擎 -- Drools
热门文章
- Windows的配置
- 移动通信原理英文缩写对照
- 改变世界的9大算法--PageRank
- 宝塔php怎么设置回收空闲进程,宝塔面板-回收站爆满后清理的三种方式
- 家用投影仪什么牌子好?怎样选投影仪
- 程序人生:如果编程语言都是女生,你会喜欢上谁?
- 清明雨纷,且容我思念
- 详解git pull命令和使用过程中遇到的常见问题:fatal: ‘origin‘ does not appear to be a git repository
- 物理层传输格式的用法,关于TF,TFS,TFC,TFCS,TFI,TFCI
- vue中使用XLSX导出多表头/单表头表格,开箱即用。