c++类中的静态成员和非静态成员

发表于:2014-3-13 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:MyStackIsEmpty    来源:51Testing软件测试网采编

  首先呢我们知道c++类中的成员分为成员变量和成员函数两大类,如果再加上static给以区分的话那么就会有以下四种:静态成员变量,非静态成员变量;静态成员函数,非静态成员函数
  (1)成员变量
  我们知道类的静态成员变量是属于整个类的,而不是属于某一个对象的(不可能据为某个可恶的对象自己拥有,因为这是大家的),静态成员变量在内存中只存在一份供各个类的实例使用。而非静态成员变量在创建对象时都会创建属于当前创建对象的一份,这是属于这个对象自己的一份。
  静态成员变量一般在类的外部进行定义形式为:
  StaticClassName    MainClassName:: staticMemberName =value;
  简单验证代码:
#include <iostream>
using namespace std;
class   MyClass
{
public:
MyClass(){ this->non_static_member=10;}
static  int  static_member;
int          non_static_member;
};
int MyClass::static_member=5;
int main()
{
MyClass  first,second;
//我们输出MyClass定义的两个对象的静态成员变量的内存地址看是否一样
cout<<&(first.static_member)<<" "<<&(second.static_member)<<endl;
//我们输出MyClass定义的两个对象的非静态成员变量的内存地址看是否一样
cout<<&(first.non_static_member)<<" "<<&(second.non_static_member)<<endl;
system("pause");
}
  (2)成员函数
  C++中所有的成员函数(静态/非静态)都存放在代码区,所有对象都享有这一份,但是静态成员函数和非静态成员函数在调用成员变量却有着限制
  (1)静态成员函数不属于某个对象,它属于整个类,在类外部调用的时候你可以通过两种方式调用
  1)class:: staticMethod()
  2) classObject.staticMethod()
  也正因为静态成员函数属于整个类,所以在其内部不存在this指针;而在非静态成员函数内部会存在一个隐藏的this指针,用来标定当前是哪个类的实例调用了此函数;
  然后呢,静态成员函数不能直接调用类的非静态成员变量,因为从上边我们知道非静态成员变量在类的实例创建时才会分配内存,而我们的静态成员函数在类的实例创建之前就已经存在,你总不能去用还没创建的东西吧?
#include <iostream>
using namespace std;
class   MyClass
{
public:
MyClass(){ this->non_static_member=10;}
static void  display();
static  int  static_member;
int          non_static_member;
};
int MyClass::static_member=5;
void MyClass::display()
{
cout<<static_member<<endl;
cout<<non_static_member<<endl; //error C2597: illegal reference to non-static member 'MyClass::non_static_member'
}
int main()
{
system("pause");
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号