转载:https://www.cnblogs.com/sixue/p/3997324.html
特点:
1、静态成员函数和静态成员变量不需要通过创建对象来开辟空间,在类里声明的时候就已经在静态区域开辟空间了
2、静态成员变量不在类的内部空间,在类的外部静态区中,所以计算类的大小时,是不包含静态成员变量的空间大小的
而非静态成员变量必须通过创建对象来开辟空间,对象包含着非静态成员变量
3、static修饰的静态成员变量在静态空间开辟空间,只初始化一次
4、类里的一般变量在对象内部,但static修饰的静态变量不在对象内部,仍单独在静态区域开辟空间,这个类可以有多个对象,静态变量不属于某一个对象,所有对象共同持有它
5、静态函数成员必须通过对象名来访问非静态数据成员。
6、在类外调用静态成员函数用 “类名 :: ”作限定词,或通过对象调用
7、与普通的成员函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针.从这个意义上来说,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其他的静态成员函数.
8、静态成员提供了一个同类对象的共享机制
#include <iostream>
using namespace std;
class Home
{
public:
//静态成员函数和静态变量不需要通过创建对象来开辟空间,在类里声明的时候就已经在静态区域开辟空间了(即实例化了)
static void print_father();//静态成员函数
void print_mother();//非静态成员函数
};
void Home::print_father()//静态成员函数在类外实现时候无须加static关键字,否则是错误的
{
cout<<"我是father\n";
}
void Home::print_mother()
{
cout<<"我是mother\n";
}
int main()
{
// 在类外调用静态成员函数用 “类名 :: ”作限定词,或通过对象调用
Home::print_father();//当对象还没有创建时,静态成员函数已经被实例化,所以可以直接通过类名直接访问,相当于C里面的函数调用
//Home::print_mother();//打开这行注释会报错,提示没有对象
}
#include "iostream"
using namespace std;
class Test
{
public:
int x;//非静态成员变量
int y;
public:
static int num;//静态成员变量
static int Getnum()//静态成员函数
{
//静态成员函数只能访问静态成员变量或静态成员函数,不可访问非静态的普通成员函数、成员变量。
//x+=5; // 这行代码是错误的,静态成员函数不能调用非静态数据成员,要通过类的对象来调用。
num+=15;
return num;
}
};
//静态成员变量一定要在类定义对象之前在类的外面进行初始化赋值,不能在类的里面,因为静态变量属于所有对象,
//属于类,不属于单个对象,初始化时不用加static关键词,但要加类的作用域(命名空间???)
int Test::num = 10;//static修饰的静态成员变量在静态空间开辟空间,只初始化一次
int main(void)
{
cout<<Test::num<<endl; //10 通过类名直接访问静态成员变量
Test::num = 20;//通过类名直接对静态成员变量赋值
cout<<Test::num<<endl; //20
cout<<Test::Getnum()<<endl; //35 通过类名直接访问静态成员函数,进而访问静态成员变量
Test a;
cout<<a.Getnum()<<endl; //50
return 0;
}
//空间占用分布
//1.这种是典型的占用8字节空间
class Test1
{
public:
int a;
int b;
private:
};
//2.这种类型占用8字节空间,静态变量不在类内部,所以不占用类的空间
class Test2
{
public:
int a;
int b;
static int c;
private:
};
int Test2::c = 10;
//3.这种类型占用的是8字节空间,函数是不占类的内部空间的,函数统一存储在代码区中
class Test3
{
public:
void create()
{
cout << "hello world" << endl;
}
private:
int a;
int b;
};