C++中的数据共享和成员特性

来源:互联网 发布:java se和ee的区别 编辑:程序博客网 时间:2024/06/05 05:25

一、静态成员

①静态成员和普通静态的区别

普通静态变量中的“静态”

静态数据成员中的“静态”

普通静态函数中的“静态”

类的静态成员函数的“静态”

区别:

静态存储内存空间

对象数据共享的声明

表示本程序文件中的内部函数

表示该成员函数仅能访问静态数据成员,是为该类所有对象共享的声明方式

②静态数据成员的注意点:

  (1)在类中使用关键字static声明静态数据成员,声明只是声明该成员属于哪一个类;

  (2)在类外为静态数据成员分配内存空间并初始化;

  (3)静态数据成员的实际定义和初始化并不受public/private/protect等访问属性限制;

  (4)静态数据成员可以看成是类中声明、类外定义的静态全局变量,具有静态生存期,在程序中从实际定义产生,到程序结束消失;

  (5)静态数据成员的内存空间不随对象的产生而分配,不随对象的消失而释放;

  (6)静态数据成员的内存空间不能再类的构造函数中创建或在析构函数中释放;

  (7)静态数据成员的访问属性和普通数据成员一样;当为Public时,在类外可以用两种方式来访问:一,对象引用。二,直接引用(类名::静态成员名)。

③静态成员函数的注意点:

  (1)引用方式与静态数据成员一致;

  (2)静态成员函数不能直接引用类中说明的非静态成员,只能引用静态成员;

  (3)但是,静态成员函数可以把类的引用或指针作为形参来间接引用非静态成员。

④静态成员的副作用:

  (1)若在一个对象中,它的某项操作修改了某个静态数据成员,则这一修改造成了所有该类对象的静态数据成员的更新;

  (2)不同对象的多次修改还会使静态数据成员的值被任意更新,从而导致程序的混乱,类的封装性遭到严重破坏。

二、友元

①友元函数

  (1)友元函数F与类只是一种“友好”关系,所以友元函数f不属于类中的成员函数,是在类中声明的一个外部函数;

  (2)友元函数的定义可以在类中进行;在类外进行定义时不能指明它所属的类;

  (3)友元函数对类中成员的访问只能通过类对象来进行(对象可以通过形参来指定,或者在函数中定义);

  (4)友元函数的声明可以出现在类中的任何一个地方;

  (5)大多数外部函数对类中数据操作是采用形参对象的方式,通过对象的“引用传递”达到修改对象数据的目的(即实参对象内容的修改)。

②友元成员函数

  (1)友元成员函数还是另外一个类的成员函数(friend+函数类型+类名::+函数名(形参))。这里的类名是它作为成员所在类的类名。

  (2)友元成员函数在类外定义时要指明它所属的类。

③友元类

  (1)友元关系不能继承;

  (2)友元关系是单向的,不具有交换性。例如,BA的友元类,则B可以通过A的对象访问A的所有数据成员和成员函数,而A不可以访问B

  (3)友元关系不具有传递性,例如,BA的友元类,CB的友元类,但C不一定是A的友元类。

总之,友元只能通过对象来访问声明友元所在类的成员。

三、Const

①常数据成员

  (1)声明格式: 数据类型+const+数据成员名  (或者  const+数据类型+数据成员名);

  (2const可以修饰一般的数据成员、引用数据成员和静态数据成员;

  (3)常数据成员的值不可以被修改更新,并且必须进行初始化;

  (4)常数据成员和常引用成员的初始化只能通过构造函数中的成员初始化列表来进行;常静态数据成员必须在类外进行定义并初始化。

  (5)任何函数都不能对常数据成员赋值;

  (6)如果有多个默认构造函数,则必须初始化常数据成员(常引用成员)。

②常成员函数

  (1)声明格式:函数类型+函数名(参数表)+const

  (2)函数的实现部分也需要在末端加上const

  (3)常成员函数不能修改任何数据成员;

  (4)常成员函数不能调用非const成员函数,但可以调用非常数据成员;

  (5)只有常成员函数才有资格被常对象调用;

  (6const关键字可以作为重载函数的区分;

四、Mutable

   (1)一个用mutable来修饰的数据成员永远处于“可变”的状态,即使是在常成员函数中,也可以被修改,即常成员函数可以修改Mutable数据;同样,也可以被常对象修改;

   (2)只能用于一个类的普通数据成员,cons数据成员,并且只用作类中的数据成员的存储类型,不能修饰类外的普通变量,也不能修饰成员函数;不能修饰静态成员和引用成员,特别的,当mutable修饰const时,const必须紧随mutable之后。

五、Explicit

  用于修饰类的构造函数,避免对象初始化采用隐式调用构造函数的方式

六、this指针

  (1)由于静态成员函数是为所有对象所共享,所以静态成员函数中使用this指针无法确定this的具体指向。在静态成员函数中是不能使用this指针

  (2this是隐藏在成员函数中的一个参数指针。当类定义对象时,this的指向总是对象本身;类声明时,this指向的是类本身;

  (3this只能在成员函数中使用,只有在成员函数中才有定义;如果获得一个对象,也不能通过对象使用this指针;this是一个常指针类型,隐藏在成员函数中的默认定义是:

类名+*const this=&类名,表明此时的this指向不可以更改,但指向的内存空间的内容可以更改;但是在常成员函数中,this的默认定义是:const 类名+*const this=&类名,表明此时this的指向和内存空间的内容都不可以改变

  (4this在成员函数的开始执行前构造,在成员函数的执行结束后清除;

原创粉丝点击