C++基础07-类之静态成员变量和成员函数

总结:

1、静态数据成员和静态成员函数属于整个类而不是某个对象

   即使没有定义对象,静态成员也是存在的

2、static 成员类外存储,求类大小,并不包含在内。 (因为存储在全局区,而类一般存储在栈区)

3、静态数据成员在类中说明,在类外定义 并且会给他分配内存空间,并初始化(一经定义则必须初始化)

4、静态数据成员的生存周期一直存在于整个程序的生命周期

4、静态成员函数只能访问静态数据成员(原因:非静态成员函数,在调用时this 针被当作参数传进。而静态成员函数属于类,而不属于对象,没有 this 指针

5、静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。

6、静态成员函数可在类内实现也可在类外

6、可以通过类作用域 ::  访问静态数据成员和静态成员函数

7、类,struct占用内存,都采用字节对齐方式计算

通过上面的案例,我们可以的得出:

C++类对象中的成员变量成员函数是分开存储的

成员变量

         普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式

          静态成员变量:存储于全局数据区中

成员函数:存储于代码段中。

一、静态数据成员的使用

//声明

static 数据类型 成员变量; //在类的内部

//初始化

数据类型 类名::静态数据成员 = 初值; //在类的外部

//调⽤

类名::静态数据成员

类对象.静态数据成员

1,static 成员变量实现了同类对象间信息共享。

2,static 成员类外存储,求类大小,并不包含在内。

3,static 成员是命名空间属于类的全局变量,存储在 data 区。

4,static 成员只能类外初始化。

5,可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

二、静态成员函数的使用

//声明

static 函数声明

//调⽤

类名::函数调⽤

类对象.函数调⽤

三、静态成员函数与普通成员函数的区别 

          静态成员函数不包含指向具体对象的指针

          普通成员函数包含一个指向具体对象的指针

使用案例1:

#if 1
#include<iostream>
using namespace std;//声明类 只是知道它有哪些数据成员 并没有为数据成员开辟空间
//只有在初始化时 才给数据成员开辟空间
class AA {
public:AA(int a, int b) {m_a = a;m_b = b;}static int m_c;  //在全局区申请/开辟空间,只能在类外初始化int get_c() {m_c++;return m_c;}void change_m_d(int d) {m_d = d;}static int get_d() {  //加static的目的是为了让类共享m_d++;//cout << m_a << endl; 编译错误 静态成员函数只能通过对象调用非静态数据成员 不能直接调用return m_d;}
private:static int m_d;int m_a;int m_b;
};
//静态成员变量的初始化 只能在类外
int AA ::m_c= 10;
int AA::m_d = 20;void test01() {static int a = 10;  //只会初始化一次a++;cout << a << endl;
}
void test02() {test01();  //11test01();  //12//cout << a << endl;  编译错误 a并不是全局变量,所以这个没有a的定义
}
//此时说明此文件的test03函数只能在此文件使用 其他文件不可访问
static void test03() {}
void test04() {AA a1(10, 20);AA a2(100, 200);cout << a1.get_c() << endl;  //11cout << a2.get_c() << endl;  //12cout << a1.m_c << endl;      //12AA::m_c = 100;cout << a1.get_c() << endl;  //101cout << AA::m_c << endl;     //101
}
void test05() {AA a1(10, 20);AA a2(100, 200);cout << a1.get_d() << endl;  //21cout << a2.get_d() << endl;  //22//AA::change_m_d(100); 编译错误 此种方式只适用于静态数据成员 或者静态成员函数a1.change_m_d(100);AA::get_d();cout << a1.get_d() << endl;  //102cout << a2.get_d() << endl;  //103
}
int main() {//test02();//test04();test05();return 0;
}
#endif

使用案例2:

#if 1
#include<iostream>
using namespace std;
class Student {
public:Student(int id, int score) {m_id = id;m_score = score;m_num++;m_sum_score+=score;}static int get_m_num() {return m_num;}static double get_score_average() {return m_sum_score/m_num;}
private:int m_id;int m_score;static int m_num;static double m_sum_score;
};
int Student::m_num = 0;
double Student::m_sum_score = 0;int main() {Student s1(1, 70);Student s2(2, 80);Student s3(3, 90);//cout << "人数和:" << Student::m_num << endl;m_num为私有成员 不可在类外访问cout << "人数和:" << Student::get_m_num() << endl;cout << "平均分:" << Student::get_score_average() << endl;
}
#endif

static占用内存使用案例:

#if 1
#include	<iostream>
using namespace	std;
class	C1
{
public:int	i;		//4int	j;		//4int	k;		//4
};	//12
class	C2
{
public:int	i;int	j;int	k;static int	m;																			//4
public:int	getK()	const { return	k; }		//4void	setK(int	val) { k = val; }	//4
};
struct	S1
{int	i;int	j;int	k;
};	//12
struct	S2
{int	i;int	j;int	k;static int	m;
};	//12?
int	main()
{cout << "c1	:	" << sizeof(C1) << endl;   //12cout << "c1	:	" << sizeof(C2) << endl;   //12cout << "c1	:	" << sizeof(S1) << endl;   //12cout << "c1	:	" << sizeof(S2) << endl;   //12return 0;
}#endif

参考自 https://www.cnblogs.com/Tempt/p/9987510.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 查询cpu 100%,Oracle 11g中查询CPU占有率高的SQL

oracle版本&#xff1a;oracle11g背景&#xff1a;今天在Linux中的oracle服务上&#xff0c;运用top命令发现许多进程的CPU占有率是100%。操作步骤&#xff1a;以进程PID:7851为例执行以下语句&#xff1a;方法一&#xff1a;(1)通过PID&#xff0c;查得相对应的系统进程对应的…

C++基础08-this指针-const修饰成员函数-函数返回引用/值

一、this指针 1、C类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效&#xff01; 2、C中类的普通成员函数都隐式包含一个指向当前对象的this指针。 3、静态成员函数、成员变量属于类 4、静态成员函数与普通成员函数的区别 静态成员函数不包含指…

oracle 10046详解,Oracle 10046事件详解

10046事件说明10046事件是Oracle提供的内部事件&#xff0c;是对SQL_TRACE的增强.10046事件可以设置以下四个级别:1 - 启用标准的SQL_TRACE功能,等价于sql_trace4 - Level 1 加上绑定值(bind values)8 - Level 1 等待事件跟踪12 - Level 1 Level 4 Level 8类似sql_trace&…

C++基础09-货物售卖和MyArray实现

1、货物出货与进货 #if 0 #include<iostream> using namespace std; /* 某商店经销一种货物。货物购进和卖出时以箱为单位。各箱 的重量不一样&#xff0c;因此商店需要记录目前库存的总重量&#xff0c;现在用 C模拟商店货物购进和卖出的情况 */ class Goods { public:…

oracle+导入emp,Oracle数据库导入导出emp文件

首先询问对方数据库的表空间名称和大小&#xff0c;然后在你的oracle中建立相应表空间&#xff0c;最后使用命令导入、导出数据。补充&#xff1a;1.要新建一个数据库&#xff1b;Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器…

C++基础10-类和对象之友元函数

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员, 这时可以将这些函数定义为该 函数的友元函数。除了友元函…

linux进程号为一,一步步探究linux进程中的用户ID

转载请注明来源chengyaogen.blog.chinaunix.net一、进程与权限A.进程时Linux/Unix操作系统中最重要的抽象之一B.进程是一个处于执行期的程序(目标代码存储在某种介质上)A process is a program(object code stored on some media) in the midst ofexecution.而进…

C++基础11-类和对象之操作符重载1

总结&#xff1a; 1、运算符重载的本质是函数重载 2、运算符重载可分为成员函数重载和全局函数重载(差一个参数) 3、运算符重载函数的参数至少有一个是类对象&#xff08;或类对象的引用&#xff09; 4、不可以被重载的操作符有&#xff1a;成员选择符(.) 成员对象选择符(.*) …

linux下搜狗安装目录,Linux安装搜狗输入法

本系统使用Ubuntu16.04LTS安装中文输入法Ubuntu17.04中支持IBUS&#xff0c;fcitx等输入法框架。分别介绍两种框架下的中文输入法安装&#xff1a;1.IBUS框架下的拼音输入法1.1在Ubuntu Software搜索“pinyin”&#xff0c;安装列表中第一个&#xff1b;1.2在系统设置-Language…

在Linux系统下实现进程,Linux进程学习(一)之Linux进程的基本知识和实现

最近一周学习了Linux 进程编程的知识&#xff0c;现对其总结如下。在第一部分中我们先对进程的基本概念以及在Linux 中是如何来现实进程的进行介绍Tiger-John说明 &#xff1a;许多人在学习中只注重如何编程&#xff0c;却忘了注重原理,不去深究其基本原理。其实操作系统的原理…

C++基础11-类和对象之操作符重载2

总结&#xff1a; 1、等号操作符重载和拷贝构造函数重载一般用在数据成员中需要单独在堆区开辟内存时(指针) 2、new&#xff0c;delete重载内部还是使用malloc和free 3、逗号表达式(,)、或者(||)&#xff0c;且(&&)&#xff0c;条件表达式(?:)具有短路功能。 但…

linux照片备份软件,Linux、Unix上5个惊艳开源备份软件

Linux和类Unix系统上5个惊艳的开源备份软件&#xff1a;Bacula、Amanda、Backupninja、Backuppc和UrBackup&#xff0c;这些都是既可以使用在Linux上也可以使用在Unix上面&#xff0c;他们的优点就是性能稳定&#xff0c;使用灵活。一个好的备份计划是非常必要的&#xff0c;这…

C/C++混淆点-运算符短路

主要内容如下&#xff1a; 按照C/C标准 1.9.18 节的说明&#xff0c;||,&&,?:三目运算符和逗号运算符采用短路运算&#xff0c;第一个表达式之后作为一个运算顺序点。 1 a && b; 2 a || b; 3 a ? b : c; 4 a, b; 短路运算仅对内置的行为有效&#xff0c;如…

C++基础12-类和对象之操作符重载-string练习

总结&#xff1a; 1、等号操作符重载注意事项&#xff1a; &#xff08;1&#xff09;防止自身赋值 &#xff08;2&#xff09;先将自身的额外开辟的空间回收掉 &#xff08;3&#xff09;执行深拷贝 2、注意函数的返回引用或者元素&#xff1a;如果需要连续使用 …

linux中类似findfirst的函数,findfirst函数的用法

函数名称: findfirst函数原型: int findfirst(char *fname,struct ffblk *ptr,int attrib)函数功能: 寻找与fname相匹配的第一个文件名称函数返回:参数说明: ptr-保存查找到的文件信息所属文件: #include #include int main(){struct ffblk ffblk;int d…

C/C++混淆点-逗号运算符

在C中&#xff0c;逗号是很常用的。作为一个运算符它虽然不常用&#xff0c;但我们也应该学会它的用法。 1.如&#xff1a;a3*4,4*5,5*6; 由于“”的优先级高于“&#xff0c;”&#xff0c;所以程序从左向右运行&#xff0c;即先运行a3*4。之后的4*5&#xff0c;5*6仅仅运行&a…

linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向

Linux系统中Nginx的安装并进行域名认证和重定向本文主要介绍Linux系统中Nginx的安装并进行域名认证和重定向&#xff0c;希望通过本知识点的讲解对大家今后的学习和工作有所帮助&#xff0c;下面进行具体介绍&#xff1a;12.6 Nginx安装cd /usr/local/srcwget http://nginx.org…

C/C++混淆点-转义字符

从表中可以看出&#xff0c;在C语言中有三种转义字符&#xff0c;它们是&#xff1a;一般转义字符、八进制转义字符和十六进制转义字符。 所有的转义字符只代表一个字符 1. 一般转义字符 这种转义字符&#xff0c;虽然在形式上由两个字符组成&#xff0c;但只代表一个字符。…

linux如何安装python环境变量中,Windows和linux环境下python安装及环境变量的配置

安装包的安装无需双版本存在情况下安装1)下载源码包2)解压源码包并进入文件夹./configure ; make && make install3)使用python -V查看是否安装成功&#xff0c;安装成功会显示python版本信息需要双版本安装python版本1)同上&#xff0c;需要下载3.6源码包2)解压源码包…

C/C++混淆点-strcat和strcpy区别

一、原因分析 假设&#xff1a; char * strNULL; strnew char[11];你想为字符串str开辟一个存储十个字符的内存空间&#xff0c;然后你现在有两个字符串&#xff1a;char * c1"abc"和char * c2"123";你想将这两个字符串都拼接在str字符串中&#xff0c;你…