您的位置:首页 > 编程语言 > C语言/C++

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

2013-06-05 22:23 375 查看
 /************************************************************

 声明为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是哪一个对象的成员了。
***********************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 C++