静态成员

目录

一、静态数据成员

二、静态成员函数


概念:在C++类的定义中,不为某个对象独享,而是为类的所有对象所共享的数据叫做静态成员。

特点:不管这个类创建了多少个对象,其静态成员在内存中只保留一份拷贝,这个拷贝为该类的所有对象所共享。

类的静态成员:

(1)静态数据成员

(2)静态成员函数

一、静态数据成员

(1)静态成员的访问属性与普通数据成员一样。

(2)静态数据成员其存储空间是独立分配的,对静态成员的任何操作都将影响共享这一存储单元的所有对象。

(3)静态数据成员具有静态生存期。

(4)静态数据成员初始化时前面不加static关键字。

(5)静态数据成员是类的成员,初始化时必须使用类作用域运算符:: 限定他所属的类。

(6)静态数据成员的初始化与他的访问控制权限无关。

PS:静态数据成员的定义在类内声明,在类外初始化。

//Student类
class Student 
{
private:
    char * Sname;
    int Sno;
    static int Scount;
};

在类外对静态成员的初始化:

int Student :: Scount = 0;

在类外,通过类名和对象访问成员(在public 属性下)

Student S1;
S1.Scount ++;               //error ,Scount存取属性为private
Student :: Scount++;        //errror

二、静态成员函数

静态成员函数可以在类内定义,也可以在类内声明为static,在类外定义时,不能再使用static关键字。

静态成员函数调用方式:

(1)类名调用

(2)对象调用

PS:

a.通过对象调用静态成员函数的前提条件是对象已经建立。

b.访问权限与普通成员函数一样。

c.可以进行重载

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

(1)静态成员函数在类中只有一个拷贝,因此他访问对象的成员时要受到一些限制,静态成员函数可以直接访问类内说明的静态成员,不能直接访问类内的非静态成员;要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。

(2)静态成员函数没有this指针。

使用静态成员维护内存中Student类对象的个数(对象指针器)

//Student.h
#include<iostream>
#include<string.h>
using namespace std;

class Student 
{
public:
	static int GetCount()
	{
		return Scount;
	}
	Student(char * = "", int = 0);
	Student(Student &);
	~Student();
private:
	char * Sname;				//姓名
	int Sno;						//学号
	static int Scount;		//总人数
};

Student :: Student(char * name, int  no)
{
	this -> Sname = new char [strlen(name) + 1];
	strcpy(this -> Sname,name);
	this -> Sno = no;
	++ Scount;
	cout << "constructing :"  << Sname << endl;
}
Student :: Student(Student & Stu)
{
	Sname = new char [strlen(Stu.Sname) + 1];
	strcpy(Sname,Stu.Sname);
	Sno = Stu.Sno;
	++ Scount;
	cout << "&constructing:"  << Stu.Sname << endl;
}

Student :: ~Student()
{
	cout << "destructing:" << Sname << endl;
	delete [] Sname;
	-- Scount;
}
int Student :: Scount = 0;
//main.cpp
#include<iostream>
#include"Student.h"
using namespace std;

int main()
{
	cout << Student :: GetCount() << endl;//使用类调用静态成员函数     
	Student s1 ("Antory");//建立一个新对象                           
	cout << s1.GetCount() << endl;//通过对象调用静态成员函数      
	Student s2(s1);//利用已有的对象建立一个新对象                       
	cout << s1.GetCount() << endl;	                                		
	Student s3[2];	//建立一个对象数组                             
	cout << Student :: GetCount() << endl;                     
	Student * s4 = new Student [3];//建立一个动态对象数组        
	cout << Student :: GetCount() << endl;                    
	delete [] s4;	//删除动态对象组                          
	cout << Student :: GetCount() << endl;                 
	return 0;
}

运行截图:

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值