zoukankan      html  css  js  c++  java
  • 静态成员变量和成员函数

      若将成员变量声明为static,则为静态成员变量,与一般的成员变量不同,无论建立多少对象,都只有一个静态成员变量的拷贝,静态成员变量属于一个类,所有对象共享。静态变量在编译阶段就分配了空间,对象还没创建时就已经分配了空间,放到全局静态区

    静态成员变量

      注意事项:(1)最好是类内声明,类外初始化(以免类名访问静态成员访问不到);(2)无论公有,私有,静态成员都可以在类外定义,但私有成员仍有访问权限;(3)非静态成员类外不能初始化;(4)静态成员数据是共享的。

     1 class Person{
     2 public:
     3     static int m_age;//静态成员变量,会共享数据,对象保有的是最后一次修改的值
     4     //最好类内声明,类外初始化
     5 
     6 //静态成员建议在类外进行初始化,但在类内也可以初始化,只是通过类名访问静态成员的属性时,访问不到
     7 //所以一般不这么做
     8 public:
     9     Person(){
    10         m_age = 10;
    11     }
    12 
    13 private:
    14     int other;
    15     static int m_other;
    16 };
    17 int Person::m_age = 0;
    18 int Person::other = 10; //非静态成员不能在类外部定义
    19 int Person::m_other = 20; //静态成员可以在类外定义
    20 
    21 void test01(){
    22     //通过对象访问属性
    23     Person p1;
    24     p1.m_age = 10;
    25 
    26     Person p2;
    27     p2.m_age = 20;
    28 
    29     cout << "p1.age = " << p1.m_age << endl; //20
    30     cout << "p2.age = " << p2.m_age << endl; //20
    31 
    32     //通过类名访问属性
    33     cout << "类名访问属性" << Person::m_age << endl; //20
    34 
    35     //静态成员虽然在类外可以定义,但在类外不可访问
    36     cout << "类名访问属性" << Person::m_other << endl; //私有成员,不可访问
    37 }
    38 
    39 int main(){
    40     
    41     test01();
    42     system("pause");
    43     return 0;
    44 }

    静态成员函数

      静态成员函数也是对象共享的:(1)静态成员函数可以直接访问静态成员变量,不能直接访问普通成员变量,但可以通过参数传递的方式访问。(2)普通成员函数可以访问普通成员变量,也可以访问静态成员变量。(3)静态成员函数没有this指针

      非静态数据成员为对象单独维护,但静态成员函数为共享函数,无法区分是哪个对象,因此不能直接访问普通变量成员,也没有this指针。

     1 class Person{
     2 public:
     3     static int m_age;
     4     int m_n;
     5 
     6 public:
     7     static void myfunc(int &a){
     8         m_age = 10; 
     9         a = 0;
    10         //m_n = 1;//不可以直接访问非静态成员
    11     }
    12 
    13     void myfunc02(){
    14         m_age = 10;
    15         m_n = 0;
    16     }
    17 private:
    18     static void myfunc01(){}
    19 };
    20 
    21 
    22 void test01(){
    23     //通过对象访问成员函数
    24     Person p1;
    25     p1.myfunc(p1.m_n); //可以通过参数传递访问非静态成员
    26 
    27     //通过类名访问成员函数
    28     cout << "类名访问属性" << Person::myfunc << endl; //20
    29 
    30     //在类外不可访问私有静态成员函数
    31     //cout << "类名访问属性" << Person::myfunc01 << endl; //私有成员,不可访问
    32 }
  • 相关阅读:
    C# 按笔画排序
    WEB EXCEL OWC开发(老资料)
    JS操作Cookie
    汉字转拼音缩写取首字母
    javaScript通用数据类型校验
    嵌套Repeater 子层获得父层字段值 经典!!!
    不同于其他的provider: SQL 网络接口, error: 26 定位指定的服务器/实例时出错
    C# UDP 发送 接收
    Js 过滤空格
    高亮文本框
  • 原文地址:https://www.cnblogs.com/qinguoyi/p/10248620.html
Copyright © 2011-2022 走看看