c++类静态数据成员与类静态成员函数

 /************************************************************
 声明为static的类成员或者成员函数便能在类的范围内共同享,
 我们把这样的成员称做静态成员和静态成员函数。
下面实例来说明这个问题,每建立一个对象设置类静态成员变量自动加一
 *************************************************************/

#include<iostream>
#include<cstring>
using namespace std;

class Internet
{
    public:
    Internet(char *name,char *address)
    {
        strcpy((*this).name,name);
        strcpy(Internet::address,address);
        count++;
    }
    static void print_count()//静态成员函数
    {
        cout<<"count is: "<<count<<endl;
    }
    void print_Internet()
    {
        cout<<"name is :"<<name<<" | "<<"address is : "<<address<<endl;
    }
    Internet &Return_this();
    public:
        char name[20];
        char address[20];
        static int count;//这里如果写成static int count=0;就是错误的
};

Internet& Internet::Return_this()//返回引用的成员函数
{
    return *this;
}

int Internet::count = 0;//静态成员的初始化

void fn(Internet &s)
{
    cout<<"Return_this().count:"<<s.Return_this().count;
}
int main()
{
    cout<<"Internet::count: "<<Internet::count<<endl;//静态成员值的输出
    Internet a1("清水河畔外网地址","bbs.qshpan.com");
    a1.print_Internet();
    Internet a2("王世晖的个人专栏","blog.csdn.net/shihui512");
    a2.print_Internet();
    Internet::print_count();//静态成员函数的调用
    Internet b("王世晖CSDN博客","blog.csdn.net/shihui512");
    b.print_Internet();
    Internet::print_count();
    fn(b);
}
/**********************
运行结果:
Internet::count: 0
name is :清水河畔外网地址 | address is : bbs.qshpan.com
name is :王世晖的个人专栏 | address is : blog.csdn.net/shihui512
count is: 2
name is :王世晖CSDN博客 | address is : blog.csdn.net/shihui512
count is: 3
Return_this().count:3
Process returned 0 (0x0)   execution time : 0.172 s
Press any key to continue.


************************/

/******************************************************************
静态成员的初始化应该在主函数调用之前,
并且不能在类的声明中出现,静态成员count的状态并不会随着一个
新的对象的新建而重新定义,
尽而了解到类的静态成员是属于类的而不是属于对象的,
所以静态成员的使用应该是类名称加域区分符加成员名称的,
在上面的代码中就是Internet::count,
虽然仍然可以使用对象名加点操作符号加成员名称的方式使用,
但是是不推荐的,静态态类成员的特性就是属于类而不专属于某一个对象。

静态成员函数的特性类似于静态成员的使用,同样与对象无关,
调用方法为类名称加域区分符加成员函数名称,在上面的代码中就是Internet::Sc();
,静态成员函数由于与对象无关系,所以在其中是不能对类的普通成员进行直接操作的。

如果上面的 static void Internet::Sc()修改成为

static void Internet::Sc()//静态成员函数
{
    cout<<name<<endl;//错误
    cout<<count<<endl;
}
静态成员函数与普通成员函数的差别就在于缺少this指针,
没有这个this指针自然也就无从知道name是哪一个对象的成员了。
***********************************************************************/

 /************************************************************
 声明为static的类成员或者成员函数便能在类的范围内共同享,
 我们把这样的成员称做静态成员和静态成员函数。
下面实例来说明这个问题,每建立一个对象设置类静态成员变量自动加一
 *************************************************************/

#include<iostream>
#include<cstring>
using namespace std;

class Internet
{
    public:
    Internet(char *name,char *address)
    {
        strcpy((*this).name,name);
        strcpy(Internet::address,address);
        count++;
    }
    static void print_count()//静态成员函数
    {
        cout<<"count is: "<<count<<endl;
    }
    void print_Internet()
    {
        cout<<"name is :"<<name<<" | "<<"address is : "<<address<<endl;
    }
    Internet &Return_this();
    public:
        char name[20];
        char address[20];
        static int count;//这里如果写成static int count=0;就是错误的
};

Internet& Internet::Return_this()//返回引用的成员函数
{
    return *this;
}

int Internet::count = 0;//静态成员的初始化

void fn(Internet &s)
{
    cout<<"Return_this().count:"<<s.Return_this().count;
}
int main()
{
    cout<<"Internet::count: "<<Internet::count<<endl;//静态成员值的输出
    Internet a1("清水河畔外网地址","bbs.qshpan.com");
    a1.print_Internet();
    Internet a2("王世晖的个人专栏","blog.csdn.net/shihui512");
    a2.print_Internet();
    Internet::print_count();//静态成员函数的调用
    Internet b("王世晖CSDN博客","blog.csdn.net/shihui512");
    b.print_Internet();
    Internet::print_count();
    fn(b);
}
/**********************
运行结果:
Internet::count: 0
name is :清水河畔外网地址 | address is : bbs.qshpan.com
name is :王世晖的个人专栏 | address is : blog.csdn.net/shihui512
count is: 2
name is :王世晖CSDN博客 | address is : blog.csdn.net/shihui512
count is: 3
Return_this().count:3
Process returned 0 (0x0)   execution time : 0.172 s
Press any key to continue.


************************/

/******************************************************************
静态成员的初始化应该在主函数调用之前,
并且不能在类的声明中出现,静态成员count的状态并不会随着一个
新的对象的新建而重新定义,
尽而了解到类的静态成员是属于类的而不是属于对象的,
所以静态成员的使用应该是类名称加域区分符加成员名称的,
在上面的代码中就是Internet::count,
虽然仍然可以使用对象名加点操作符号加成员名称的方式使用,
但是是不推荐的,静态态类成员的特性就是属于类而不专属于某一个对象。

静态成员函数的特性类似于静态成员的使用,同样与对象无关,
调用方法为类名称加域区分符加成员函数名称,在上面的代码中就是Internet::Sc();
,静态成员函数由于与对象无关系,所以在其中是不能对类的普通成员进行直接操作的。

如果上面的 static void Internet::Sc()修改成为

static void Internet::Sc()//静态成员函数
{
    cout<<name<<endl;//错误
    cout<<count<<endl;
}
静态成员函数与普通成员函数的差别就在于缺少this指针,
没有这个this指针自然也就无从知道name是哪一个对象的成员了。 
***********************************************************************/



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值