c++静态成员变量和静态成员函数

转载: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;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值