zoukankan      html  css  js  c++  java
  • C++中static与const成员

    一.static成员

    (1)static数据成员

     static数据成员的创建是为了对象之间的共享和沟通,具有以下特点:

    1.1 static数据成员属于类,只占一份空间(不像普通数据成员每个对象中都有一份数据),其空间在对象之外,但可以被各个同类对象共享。

    1.2 static数据成员不能通过构造函数初始化(这是因为static数据成员只有一份数据,而每实例化一个对象就会执行一次构造函数),只能在类外初始化(编译器默认赋其为0)。

    一般形式为:数据类型 类名::静态数据成员 = 初值;//不加static修饰。加粗处为与全局变量定义的不同点。

    1.3 声明类时静态数据成员已经被分配空间(早于对象的构造),到程序运行结束才释放(晚于对象的析构)。

    1.4 被定义成public数据成员时,在main函数内既可以通过类名来引用,也可以通过对象来引用。

    1.5 static数据成员可以被static成员函数和非static成员函数所引用。

    1.6 类的static数据成员和它所有派生类对象也是共享的。

    (2)static成员函数

    小叙this指针:

     1 class A
     2 {
     3     public:
     4     int i;
     5     void display();
     6 };
     7 void A::display()
     8 {
     9    cout<<i<<endl;   
    10 }    
    11 
    12 int main(void)
    13 {
    14      A a1;
    15      A a2;
    16      a1.i = 1;
    17      a2.i = 2;
    18      a1.display();
    19      a2.display();
    20 }
    display();<=>display(A* const this);//指向谁在函数内不能变,指向的对象值在函数内可以变。

    对象a1和a2各有一份数据成员i,而成员函数只有一份供共用。成员函数怎么选择显示哪个i呢?

    这里成员函数所隐含的形参-本类对象指针this发挥了作用。对象在调用成员函数时,会把自身地址传递给this指针,然后由this去引用数据成员。

    a1.display();<=>a1.display(&a1);

    结束小叙。

    普通成员函数被每个对象共享且属于每一对象,故成员函数有指向该对象的this指针,可以访问普通数据成员。

    静态成员函数被每个对象共享但不属于任一对象,故静态成员函数没有指向该对象的this指针,不可以访问普通数据成员。

    这是静态成员函数和普通成员函数的根本区别。

    二. const成员

    const的意思,就是不可以被改变或不可以改变。

    (1)const数据成员

    const数据成员具有以下特点:

    1.1 不能被改变,不能被赋值。

    1.2 只能通过构造函数的参数初始化表进行初始化。

    Time::Time(int h):hours(h){}

    (2)const成员函数

    类型名 函数名(参数表) const;//定义时也加const

    2.1 const成员函数隐含形参(const 类名* const this)。

    指向谁在函数内不能变,指向的对象值在函数内也不能变。

    2.2 可以引用对象的所有数据成员,但不可以改变。

    2.3 不允许其调用普通成员函数(为了防止const成员函数通过普通成员函数改变数据成员)。

    (3) const对象

    类名 const 对象名(实参);<=>const 类名 对象名(实参);

     const对象的数据成员都是,const数据成员。

    1.1 必须有初值。

    1.2 只能通过构造函数的参数初始化表进行初始化。

    1.3 只能调用const成员函数(调用普通成员函数,隐形指针传递非法--参考谭浩强C++,解释在上)。

    1.4 被声明为mutable的数据成员,可以通过(const对象)调用const成员函数修改值。

    说明:由于const成员函数有this指针,而static成员函数没有this指针,故这两个关键词不能同时修饰一个成员函数。

  • 相关阅读:
    数据库优化方案之分库分表
    聊聊ThreadLocal源码(基于JDK1.8)
    HashMap扩容死循环问题
    Synchronized偏向锁和轻量级锁的升级
    【Java并发编程之深入理解】Synchronized的使用
    ConcurrentHashMap 1.8为什么要使用CAS+Synchronized取代Segment+ReentrantLock
    面试必备技能:HashMap哪些技术点会被经常问到?
    序列键生成器及单例多例模式
    Effective.Java第1-11条
    抽象工厂(AbstractFactory)模式
  • 原文地址:https://www.cnblogs.com/shijianchuzhenzhi/p/4394570.html
Copyright © 2011-2022 走看看