c++静态成员

静态属性
在类设计中,用关键字 static 修饰的数据成员为静态数据成员。有该类型实例化的所有对象,共享
系统为静态成员分配的一个存储空间,而这个存储空间是程序执行main函数之前分配的,在实例化对象时不再为静态成员分配空间(静态成员数据不在对象空间中)。
设计静态数据成员目的是信息共享

静态成员修饰函数

修饰局部变量 生存期不一样,static修饰的在数据区,否则在栈区

修饰全局变量 生存期一样,可见性发生改变, 只在此cpp文件中,其他链接不能访问

与全局对象相比,静态数据成员的有优势

1.静态数据成员没有进入程序的全局名字空间,不存在与其他全局名字冲突的可能性

2.实现信息隐藏,静态可以为private,全局不能

class Circle
{
private:
//静态成员的声明,注意私有
static const double pi;
private:
double radius;
public:
Circle(double r = 0.0):pi(3.14),radius(r) {} //error
Circle(double r = 0.0):radius(r) {} // ok;
Circle(double r = 0.0):radius(r)
{
pi = 3.14; // ok; 但是没有必要
}
};
//静态成员的定义
const double Circle::pi = 3.14;

静态数据是该类所有对象所共有的,可提供同一类型的所有对象之间,信息共享或信息交换的一种方式。
静态数据成员属于整个类型,使用时可用以下格式:
类名::静态数据成员名 或 对象.静态数据成员名 (前提是可访问符为public)

class Cat // 猫
{
private:
static int num;
private:
std::string _owner; //猫主
std::string _name; //猫名
public:
Cat(const string &owner,
const string &name):_owner(owner),_name(name)
{
num+=1;
cout<<"create Cat num: "<< num<<endl;
}
~Cat()
{
num-=1;
cout<<"Destroy Cat num: "<<num<<endl;
}
};
int Cat::num = 0;
void fun(Cat cat)
{
}
void main()
{
Cat cata("yhp","pt");
Cat catb("hm","bl");
fun(cata);
return 0;
}

在类的成员函数中使用静态数据成员,静态成员之前没有this

class Cat // 猫
{
private:
static int num;
private:
std::string _owner; //猫主
std::string _name; //猫名
public:
Cat(const string &owner,
const string &name):_owner(owner),_name(name)
{
num+=1;
cout<<"create Cat num: "<< num<<endl;
}
~Cat()
{
num-=1;
cout<<"Destroy Cat num: "<<num<<endl;
}
void print() const
{
cout<<"Owner: "<<_owner<<" Name: "<<name<<endl;
num+=1; // not this;
}
};

静态属性的类型是int,short, char ,并且是const , 可以在类中直接初始化。

class Bar
{
private:
static const int nameSize = 20; // ok;
static const char name[nameSize]="xiao cheng bar"; // error;
};

静态数据成员的类型可以是其所属类 而非 static 数据成员只能被声明为该类的指针. 

class Bar
{
private:
std::string _name;
private:
static Bar sm_bar; // ok;
private:
Bar m_bar; // error;
Bar *pb; // ok;
};

 总结:静态数据成员用法

1设计静态数据成员目的是信息共享,和信息交流.
2.类的静态数据成员为所有类对象所共享,不属于某个具体的实例。
3.类的静态数据成员必须在类外定义,定义时不添加static关键字,不能在构造函数的初始化列表中创建。
4.类的静态数据成员类型是int,short, char ,long long ,并且是const , 可以在类中直接初始化,也可以在类外初始化.
5.在类的成员函数中使用静态数据成员,静态数据成员之前没有this.
6.当类的静态数据成员为公有时,可以在外部函数使用: 类名::静态数据成员名或对象.静态数据成员名。
可以在类体中定义自身的静态类型对象.
静态方法

class Object
{
private:
static int num;
private:
int value;
public:
Object(int val = 0):value(val),num(val) {}// error;静态属性只能在类外初始化
Object(int val):value(val)
{
num = 1; // 不是初始化,是赋值
}
void print()
{
cout<<"value: "<<value<<" num: "<<num<<endl;
}
static void show() // 静态函数 not this
{
cout<<"value: "<<value<<" num: "<<num<<endl;
}
static void fun(Object &obj) // const // 不能定义为常方法。
{
cout<<obj.value<<" "<<num<<endl;
}
};
int Object::num = 0;

静态成员函数没有 this 指针,因此在静态成员函数显式地使用this指针都将导致编译时刻错误。
试图访问隐式使用 this 指针所指向的非静态数据成员也会导致编译时刻错误。
总结:
一个常规的成员函数声明描述了三件在逻辑上相互不同的事情:
该函数能访问类声明的私用部分。
该函数位于类的作用域之中。
该函数必须经由一个对象去激活(有一个this指针)。
将一个函数声明为友元可以使它只具有第一种性质。
将一个函数声明为static 可以使它只具有第一种和第二种性质

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值