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是哪一个对象的成员了。
***********************************************************************/
/************************************************************ 声明为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++类静态数据成员与类静态成员函数
- C++类中常量数据成员和静态数据成员初始化
- 浅谈C++类静态数据成员与类静态函数成员
- C++类中具有静态数据成员
- C++类中静态成员数据和静态成员函数的自我理解
- C++类静态数据成员与类静态成员函数
- C++类静态数据成员与类静态成员函数
- C++类静态数据成员与类静态成员函数
- 2017-12-14 乱入一道C++类的学习的题(静态数据成员初始化)
- C++类静态数据成员与类静态成员函数
- C++类的三种数据成员:常量(const)、静态(static)、普通 的赋值方式
- c++类的成员函数、数据成员存储方式(是否属于类的对象)
- C++类静态成员与类静态成员函数
- c++类不含有数据成员(静态除外),则不会为该类实例分配存储空间,该类实例只占用一个字节空间
- C++类的静态数据成员及其用法
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
- C++类中的常数据成员和静态数据成员的区别
- C++类中静态数据成员MAP如何初始化
- 静态数据成员和静态数据成员函数
- C++类中的常数据成员和静态数据成员的区别