c++类中的静态成员和非静态成员
来源:互联网 发布:淘宝奥比岛珠宝表情 编辑:程序博客网 时间:2024/04/26 05:51
首先呢我们知道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");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
但是我们却可以通过静态成员函数的形参来间接调用某个对象的非静态成员变量;
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass(){ this->non_static_member=10;}
static void display(MyClass obj);
static int static_member;
int non_static_member;
};
int MyClass::static_member=5;
void MyClass::display(MyClass obj)
{
cout<<obj.static_member<<endl;
cout<<obj.non_static_member<<endl;
}
int main()
{
MyClass a;
MyClass::display(a);
system("pause");
}
- 类中的静态成员和非静态成员(C#版)
- c++类中的静态成员和非静态成员
- 类中的静态成员函数访问非静态成员变量
- 静态成员和非静态成员
- 静态成员和非静态成员
- C++---类中的静态成员
- 类的静态成员和非静态成员的区别
- 蛙蛙推荐:类中的静态成员和非静态成员(C#版)
- 蛙蛙推荐:类中的静态成员和非静态成员(C#版)
- 静态成员、非静态成员
- 静态类和静态成员中的要点
- C++中的类静态成员和静态成员函数
- C++中的类静态成员和静态成员函数
- c++类中的静态成员函数和静态成员变量
- 类中的静态成员变量和静态成员函数
- 静态类和静态类成员以及非静态类的静态成员
- C++/Java__中类模板中的静态成员变量和静态成员函数
- 静态成员函数怎么引用该类中的非静态成员
- ACM-简单题之找新朋友——hdu1286
- MFC传递消息的四个步骤
- 单例模式下的double check
- 九度 OJ 1162 I Wanna Go Home 最短路问题
- ECJTU13级队员欢乐水题赛——题解
- c++类中的静态成员和非静态成员
- 智勇三国工作概要
- 用户空间具体是如何处理dpif_upcall ?(2)构造datapath actions
- linux安装软件包相关问题
- FreeType
- JAVA与android 基本数据类型所占的字节数
- 当android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程
- 多进程聚写(一)
- 签到程序