C++静态成员和常成员

一丶静态成员

静态成员包括静态数据成员和静态函数

1.静态数据成员

类中的非静态数据成员,每一个类对象都拥有一个副本,即每一个对象的同名数据成员可以存储不同的数值,这是保证了每个对象拥有区别于其他对象的特征。
而静态成员是不管创建了多少个对象,他们之间只有一个副本,也就是所有对象都共享这个静态数据成员。

静态成员的声明要是用static关键字

class Myclass
{
    private:
        int a,b,c;
        static int sum; //私有静态成员
}
Myclass p1,p2;
//则对象p1和p2都共享静态数据成员sum

静态数据成员初始化格式:

<数据类型><类名>::<静态数据成员名>=<初始值>
int Myclass::sum=32

初始化时注意:
1)必须在文件作用域内对静态成员进行初始化(即应在类体外对静态数据成员进行初始化)
2)静态数据成员进行初始化时不加static关键字
3)静态数据成员是类的成员,因此在初始化时必须使用作用域运算符(::)限定他所属的类

2.静态成员函数

私有的受保护的静态数据成员必须通过公有的接口进行访问,一般将这个接口定义为静态成员函数。
静态成员函数也是属于整个类而不是属于某一个类的对象,用static关键字声明,可以在类体内定义,也可以在类体外定义,在类体外定义时,不需要加static关键字做前缀

访问对象成员时受限制:
静态成员函数可以直接访问类中的静态成员,但是不能直接访问类中的非静态成员,若要访问非静态成员,必须通过参数传递的方式得到相应的对象,在进行访问

class Point
{
    public:
         static void Display(Point& p);//声明静态成员函数,参数为类对象
    private:
         int X,Y,Z;
         static int count;//声明静态数据成员
}
int Point::count=0;//对静态成员进行初始化
void Display(Point& p)//类体外定义成员函数
    {
    cout<<"该点为:"<<p.X<<","<<p.Y<<","<<p.Z<<endl;//利用类对象调用类的非静态数据成员
    cout<<"我是类体外定义的静态成员函数"
    }   
int main()
{
Point p1;
Point::Display(p1);//访问静态成员
return 0;
}

静态函数可以直接访问静态成员,通过以下方式访问非静态成员:

<类名>::<静态成员函数名><参数表>

二丶常成员

数据共享可能会破坏数据的安全性,因此对于即需要共享有需要放防止改变数据的应该定义为常量进行保护,以保证程序运行期间是不可改变的。使用const修饰符进行定义,常成员包括常对象,常成员函数和常数据成员。

1.常对象
使用const关键字修饰的对象成为常对象,定义格式如下

<类名>const<对象名>
或者
const<类名><对象名>

常对象定义时不能被更新

class Point
{
public:
    Point(int a,int b):x(a),y(b){}//构造函数
private:
    int x,y;
}
const Point p1(1,2);//p1为常对象,不能被更新

2.常成员函数
使用const关键字说明的成员函数成为常成员函数,格式如下:

<返回类型><函数名>(<参数表>)const

注意:
常对象和一般对象可以调用常成员函数
常对象不能调用一般成员函数
一般对象可以调用一般函数

例子如下:

class Point//定义Point类
{
public:
    Point(int a,int b):x(a),y(b){};
    void Display()const;//定义常成员函数
    void Move();
private:
    int x,y;
}
void Display()const//常成员函数
{
    cout<<"Point:"<<x<<","<<y<<endl;
}
void Move()
{
    cout<<"Point:"<<x+1<<","<<y+1<<endl;
}
int main(){
    Point p1(1,2);//定义一个一般对象,并进行初始化
    const Point p2(5,6);//定义一个常对象
    p1.Move();//一般对象访问一般函数
    p1.Display();//一般对象访问常函数
    p2.Display();//常对象只能访问常函数
    return 0;
}

3.常数据成员
const修饰的数据成员为常数据成员,常数据成员也必须进行初始化,并且不能被更新,但是常数据成员的初始化只能用过构造函数的成员初始化列表进行初始化

class Point
{
public:
    Point(int a,int b):x(a),y(b){};//构造函数
    void Print()const{cout<<x<<","<<y<<endl;}
private:
    const int x;
    int y;
}
Point::Point(int a,int b):x(a),y(b){}
int main()
{
    Point p1(3,4);//利用构造函数的成员初始化列表对const数据成员进行初始化
    p1.Print();//一般对象调用常函数
    return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值