首页 > 其他分享 >第七章 类和对象 Part3 类的静态成员

第七章 类和对象 Part3 类的静态成员

时间:2023-02-15 23:13:12浏览次数:39  
标签:变量 Person 静态 成员 int Part3 static 第七章

静态成员

  • 在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字static声明为静态的,称为静态成员。
  • 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。

静态成员变量

1.在一个类中,若将一个成员变量声明为static,这种成员称为静态成员变量。与一般的数据成员不同,无论建立了多少个对象,都只有一个静态数据的拷贝。静态成员变量,属于某个类,所有对象共享。
2.静态变量,是在编译阶段就分配内存空间,放在全局静态区;在对象还没有创建时,就已经分配空间。
    1. 静态成员变量必须在类中声明,在类外定义。
    1. 静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。
    1. 静态数据成员可以通过类名或者对象名来引用。
点击查看代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
//#include<string>
using namespace std;

class Person
{
public:
	static int m_Age;//加入static就是静态变量了,会共享数据
	//静态成员变量,在类内声明,在类外进行初始化
private:
	static int m_other;//私有权限,在类外不能访问,但是在类外可以初始化
};
int Person::m_Age = 10;//类外初始化实现
int Person::m_other = 10;//看似实在类外进行的初始化,其实写上作用域之后,也算是写到类内了

void test01()
{
	//1.通过对象访问属性
	Person p1;
	p1.m_Age = 10;

	Person p2;
	p2.m_Age = 20;

	cout << "p1 = " << p1.m_Age << endl;//10 还是 20? 20 //原因:共享数据
	cout << "p2 = " << p2.m_Age << endl;//10 还是 20? 20 //原因:共享数据 

	//2.通过类名访问属性
	cout << "通过类名访问Age:" << Person::m_Age << endl;
	//这就是为什么不要在类内实现:
	//因为,如果通过对象去访问这个属性,可以调用构造函数
	//但是如果通过类名,就不能了调用构造函数了,即不能通过类名访问这个属性了
}

int main()
{
	test01();

	system("pause");
	return 0;
}

image

静态成员函数

  1. 在类定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数使用方式和静态变量一样,同样在对象没有创建前,即可通过类名调用。
  2. 静态成员函数主要为了访问静态变量,但是,不能访问普通成员变量。
  3. 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。
  • 静态成员函数只能访问静态变量,不能访问普通成员变量
  • 静态成员函数的使用和静态成员变量一样
  • 静态成员函数也有访问权限
  • 普通成员函数可访问静态成员变量、也可以访问非静态成员变量
点击查看代码
class Person{
public:
	//普通成员函数可以访问static和non-static成员属性
	void changeParam1(int param){
		mParam = param;
		sNum = param;
	}
	//静态成员函数只能访问static成员属性
	static void changeParam2(int param){
		//mParam = param; //无法访问
		sNum = param;
	}
private:
	static void changeParam3(int param){
		//mParam = param; //无法访问
		sNum = param;
	}
public:
	int mParam;
	static int sNum;
};

//静态成员属性类外初始化
int Person::sNum = 0;

int main(){

	//1. 类名直接调用
	Person::changeParam2(100);

	//2. 通过对象调用
	Person p;
	p.changeParam2(200);

	//3. 静态成员函数也有访问权限
	//Person::changeParam3(100); //类外无法访问私有静态成员函数
	//Person p1;
	//p1.changeParam3(200);
	return EXIT_SUCCESS;
}

const静态成员属性

  1. 如果一个类的成员,既要实现共享,又要实现不可改变,那就用 static const 修饰。
  2. 定义静态const数据成员时,最好在类内部初始化。
class Person{
public:
	//static const int mShare = 10;
	const static int mShare = 10; //只读区
};
int main(){

	cout << Person::mShare << endl;
	//Person::mShare = 20;

	return EXIT_SUCCESS;
}

标签:变量,Person,静态,成员,int,Part3,static,第七章
From: https://www.cnblogs.com/Epiephany/p/17125114.html

相关文章

  • C++模板类中的静态成员变量的初始化
    变量声明:template<classT,enumEDeviceTypeg_eDeviceType>classILocalDeviceProtocolImpl:publicT{public:ILocalDevicePr......
  • C语言:静态变量
    #include<stdio.h>//变量作用域:局部变量全局变量//函数外声明的变量称为全局变量,函数内声明的变量的称为局部变量//变量生存周期:变量的存在时间//静态存储方式:指在......
  • 重学Java-第七章 Java表达式、语句和块
    7.1表达式7.1.1定义 表达式是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合,约束变量是在表达式中已被指定数值,......
  • 创建.a静态库, framework静态库
    在APP项目中使用的静态库有两种,一是.a静态库,另一种是framework静态库。下面分布介绍这2中静态库的创建过程,以及通过脚本工具做自动化打包的2种方式。.a静态库生成.a文件......
  • 使用 vuepress + gitee pages 搭建静态网站
    VuePress(v1):https://v1.vuepress.vuejs.org/zh/guide/shell脚本:npm构建和推送docs/.vuepress/dist到远程分支if[!-epackage.json];thenecho'请在package......
  • 使用express设置静态目录,创建服务,响应get请求
    //1、引入expressconstexpress=require('express');//在node应用中载入express//2、创建应用对象constapp=express();//建立一个express实例constexpres......
  • 第七章 类Part2
    深拷贝和浅拷贝浅拷贝同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝.一般情况下,浅拷贝没有任何副作用......
  • typecho——typecho如何开启伪静态
    前言更新EasyBe的时候,突然发现博客一直没有配置伪静态,那就配置下吧,随便写个文档~内容!>伪静态配置主要分为两部分,nginx配置和开启地址重写功能;nginx将以下配置......
  • 第七章 类_Part1
    1.类和对象1.1类和对象的基本概念1.1.1C和C++中struct区别c语言struct只有变量c++语言struct既有变量,也有函数1.1.2类的封装​ 我们编写程序的目的是为了解决现......
  • 实战:第七章:微信H5支付时用户有微信分身停留5秒后未选择哪个微信分身,也未支付就被动回
    三种问题:微信H5支付时用户有微信分身停留5秒后未选择哪个微信分身,也未支付就被动回调到商户支付是否完成的页面安卓H5支付设置了redirect_url后调起微信收银台5秒后回退......