静态成员
静态成员变量
静态成员变量属于整个类所有,所有对象共享类的静态成员变量
静态成员变量需要在类外初始化
可以通过类命直接访问共有静态成员变量
可以通过对象名访问公有静态成员变量
静态成员变量在程序内部位于全局数据区
静态成员变量的生命期不依赖于任何对象,为程序的生命周期
#include<iostream>
Using namespace std;
#include<unordered_map>
Class A
{
public:
static int a;
int b;
A(){
a++;//所有对象共享一个静态成员变量,用a表示创建了多少个对象
cout<<a<<endl;
}
};
int A ::a = 0;//在类外初始化静态成员变量,因为静态成员变量不属于某一个对象,不需要创建对象也能调用
Int main(){
A::a = 1;//静态成员变量是属于整个类的,可以通过类名+::直接调用
A a ;
A b;
A c;
a.a = 5;//可以通过对象调用静态成员变量
}
静态成员函数
定义静态成员函数,直接使用static关键字修饰即可,静态成员函数属于整个类所有,没有this指针
静态成员函数只能直接访问静态成员变量和静态成员函数(因为没有this指针,因为访问普通的成员变量和成员函数前面都隐含的this)
可以通过类名直接访问类的公有静态成员函数
可以通过对象名访问类的公有静态成员函数
#include<iostream>
#include<string>
using namespace std;
class A{
public:
int c;
static int b;
void s(){
}
static void d(){
}
static int fun(int a){
d();//静态成员函数可以调用静态成员函数
b= 2;//静态成员函数可以调用静态成员变量
//s(); error s()相当于this->s(),但是静态成员函数里面没有this,因为他属于整个类,不具体属于某个对象
//c =3; error 因为非静态成员变量需要创建对象的时候才能分配空间,然而静态成员变量函数不需要创建对象就已经存在了,所以有冲突。
cout<<"静态成员函数"<<endl;
return 0;
}};
int A::b = 1;
int main(){
A::fun(1);//通过类名 + 作用域直接访问类的共有静态成员函数
A a;
a.fun(1); //通过对象直接访问类的公有静态成员函数
A b();//这里没有调用类的默认构造函数,编译器会认为他是一个函数声明,A是返回值类型 b 是函数名 ()是函数参数
}
友元
类的友元是定义在类内部,但有权访问类的所有私有成员.友元可以是一个函数,该函数被称为友元函数,友元可以是一个类,被称为友元类。声明一个友元只需要在类定义中声明一个函数或者一个类并且前面加上关键字friend。(友元破坏了封装)友元函数不是类的成员 不能被继承(不破坏继承机制) 没有this指针
Class A{
int a ;
public:
friend void fun();
friend class B;
};
void fun(){
A a;//创建了一个A类型的对象a
a.a;//在类A中声明友元函数在函数内部就可以访问类的私有成员变量
}
class B{
A a;
void fun(){
a.a;//在类A中把B声明为友元类,即可访问私有成员变量
}
};
const
常含数 对变量只有读权限,没有写权限
P = 2;常对象 只能调用常函数,常函数不能修改变量
能重载