静态成员

C++ 类的静态成员(static)

会有一股神秘感。 提交于 2020-02-22 18:30:15
静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,如:设置全局性的变量或对象是一种方法。但是,全局变量或对象是有局限性的。这一章里,我们主要讲述类的静态成员来实现数据的共享。 静态数据成员 在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。 使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对 象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。    静态数据成员的使用方法和注意事项如下:   1、静态数据成员在定义或说明时前面加关键字static。   2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:     <数据类型><类名>::<静态数据成员名>=<值>   这表明: (1) 初始化在类体外进行 ,而前面不加static,以免与一般静态变量或对象相混淆。   (2) 初始化时不加该成员的访问权限控制符private,public等。   (3) 初始化时使用作用域运算符来标明它所属类,因此, 静态数 据成员是类的成员,而不是对象的成员。   3

c++中的 static 关键字

浪尽此生 提交于 2020-02-15 23:49:35
注:若没有特指是 静态成员时,默认都是普通成员; 1 类中的普通成员   类中的成员变量 和 成员函数 是分开存储的。其中,     1)每个对象都有 独立的成员变量 ;成员变量可以存储在 栈空间、堆空间、全局数据区;     2)所有对象 共享类的成员函数 ;成员函数 只能存储在 代码段; 2 类中的静态成员( static )   类中的静态成员     1、用 static 关键字 修饰;     2、可以用 类名::成员名 访问 静态成员;     3、静态成员 属于 整个类;     4、静态成员 是所属类的成员,其它类不能访问;     5、静态成员的内存分配 是 唯一的;   1) 静态成员变量     特征:1、静态成员变量 属于 整个类所有 ;        2、静态成员变量的生命周期不依赖任何对象;(静态成员变量的生命周期在程序的运行期)        3、所有对象 共享 类的静态成员变量;        4、可以通过 类名 直接访问 公有的 静态成员变量;        5、可以通过 对象名 访问公有的静态成员变量;        6、静态成员变量 需要在 类外单独分配空间 ;(类内声明、类外定义并初始化)        7、静态成员变量 在程序内部位于 全局数据区,不计入类的内存计算。      原因/ 好处

静态成员 static 能被继承吗

北城以北 提交于 2020-02-12 04:31:04
在类定义中,它的成员(包括数据成员和 成员函数)可以用关键字static声明为静 态的,这些成员称为静态成员 静态成员的特性: • 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的 对象共享 静态成员包括: • 静态数据成员 • 静态成员函数 在一个类中,若将一个数据成员声明为 static,这种成员称为静态数据成员。 (静态数据成员在类内声明,在类外定 义) 与一般的数据成员不同,无论建立了多 少个对象,都只有一个静态数据的拷贝 可以认为该静态数据是属于该类的,而 不是具体的属于某一个对象 说明: • 静态数据成员属于类(准确地说,是属于类中 一个对象集合),而不像普通数据成员那样属 于某一对象, 因此可以使用“类名::”访问静态 的数据成员。但也可以通过“对象名.”访问 • 静态数据成员不能在类中进行初始化,因为在 类中不给它分配内存空间,必须在类外的其它 地方为它提供定义。一般在main() 开始之前、类的声明之后的特殊地带为它提供定义 和初始化。缺省时,静态成员初始为0 静态成员函数可以在类内定义。也可以在类内声明,类外定义。在类外定义时,不要用 static前缀 • 编译系统将静态成员函数限定为内部连接, 也就是说,与现行文件相连接的其它文件中 的同名函数不会与该函数发生冲突,维护了 该函数使用的安全性,这是使用静态成员函 数的一个原因 •

【Java基础08】内部类、枚举类、日期和时间、Math、Random

妖精的绣舞 提交于 2020-02-06 02:01:26
1 内部类 1.1 概念 大部分时候,类被定义成一个独立的程序单元,在某些情况下,也会把一个类放到另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类被称为外部类。 1.2 作用 1.提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。 2.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问。但外部类不能访问内部类的实现细节,例如内部类的成员变量。 3.匿名内部类适合用于创建那些仅需要一次使用的类。 注意: 1.内部类比外部类可以多使用三个修饰符:private、protected、static,外部类不可以使用这三个修饰符。 2.非静态内部类不能拥有静态成员。 1.3 非静态内部类 成员内部类分为两种,静态内部类和非静态内部类,使用static修饰的成员内部类是静态内部类,没有使用static修饰的成员内部类是非静态内部类。(在方法中定义的内部类被称为局部内部类) 不允许在外部类的静态成员中直接使用非静态内部类,不允许在非静态内部类中定义静态成员。非静态内部类里不能有静态方法、静态成员变量、静态初始化块。 1.4 静态内部类 如果使用static来修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。因此使用static 修饰的内部类被称为类内部类

c++学习记录(七)

徘徊边缘 提交于 2020-02-03 14:29:01
静态成员变量和静态成员函数 - 基本概念 静态成员:在说明前面加了static关键字的成员 static int a; static void PrintTotal(); 静态成员变量与普通成员变量的区别:普通成员变量每个对象各自有一份,而静态成员变量一共就一份,为所有对象共享。 sizeof 运算符不会计算静态成员变量 class CMyclass{ int n; static int s;} 则 sizeof(CMyclass) =4 静态成员函数与普通成员函数的区别:普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象 静态成员(包括静态成员变量和静态成员函数)不需要通过对象就可以访问 - 如何访问静态成员 类名::成员名 CRctangle ::PrintTotal(); 对象名.成员名 CRctangle r;r.PrintTotal(); 注意:不是作用于对象r 指针->成员名 CRctangle *p=&r;p->PrintTotal(); 注意:不是作用于对象r 引用.成员名 CRctangle &ref=r;int n=ref.nTotalNumber; 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在 静态成员函数本质上是全局函数 设置静态成员这种机制的目的是将和某些类紧密相关的全局变量和函数写到类里面

C++-Record24—静态成员变量和静态成员函数

北城以北 提交于 2020-01-22 13:06:01
目录 为什么要有"static"关键字 基本概念 举例说明 总体代码 为什么要有"static"关键字 用类可以定义很多对象,每一个对象都有属性,那请问有没有一个属性,是属于所以对象的?假设有这个属性c,是属于所有对象的,那么这个变量,就是静态成员变量,要用"static"关键字修饰。 基本概念 1 )定义静态成员变量 关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象的共享机制 把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 static 成员 静态成员局部于类,它不是对象成员 2)静态成员函数 静态成员函数数冠以关键字static 静态成员函数提供不依赖于类数据结构的共同操作,它没有this指针 在类外调用静态成员函数用 “ 类名 :: ”作限定词,或通过对象调用 注意:静态成员函数中,不能使用普通变量和普通成员函数! 举例说明 先写个类BB: class BB { public: void printC() { cout<<"c:"<<c<<endl; } void AddC() { c = c + 1; } static void getC() //静态成员函数 { cout<<"c:"<<c<<endl; //请在静态成员函数中,能调用 普通成员属性 或者 普通成员函数吗? //cout<<"a:"<<a<

228 静态成员和实例成员

混江龙づ霸主 提交于 2020-01-20 19:53:59
1.2.1 实例成员 实例成员就是构造函数内部通过this添加的成员 如下列代码中uname age sing 就是实例成员,实例成员只能通过实例化的对象来访问 function Star(uname, age) { this.uname = uname; this.age = age; this.sing = function() { console.log('我会唱歌'); } } var ldh = new Star('刘德华', 18); console.log(ldh.uname);//实例成员只能通过实例化的对象来访问 1.2.2 静态成员 静态成员 在构造函数本身上添加的成员 如下列代码中 sex 就是静态成员,静态成员只能通过构造函数来访问 function Star(uname, age) { this.uname = uname; this.age = age; this.sing = function() { console.log('我会唱歌'); } } Star.sex = '男'; var ldh = new Star('刘德华', 18); console.log(Star.sex);//静态成员只能通过构造函数来访问 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

Effective Java 3

对着背影说爱祢 提交于 2020-01-20 02:05:57
Item 15 使类和成员的可访问性最小化 1、一个设计的好的组件应该隐藏它的所有实现细节,清晰地将它的 API 以及具体实现分开。 2、尽可能的使用低级别的访问级别,降低类和成员的可访问性。 3、如果一个包私有的顶层类或接口只被一个类使用,考虑将它变为私有的静态内部类。 3、设计类的时候首先设计你所有的公有 API,然后应该反射性的将其他剩余的类设为private,只有当它真的需要提高访问级别时,才将它提升为包私有的。 4、protected的类是API的一部分,需要始终保证对它的支持,protected的级别在实际使用中是较少的。 5、如果一个方法覆盖了超类的一个方法,不能使它的访问级别比超类中的低。 6、在调试程序时,可以适当提高某些方法的访问性。 7、public类的实体域通常是非public的。 8、一个类拥有public static final array 是错误的,作为替代选择以下方法: private static final Thing[] PRIVATE_VALUES = { ... }; public static final List<Thing> VALUES =Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES)); private static final Thing[] PRIVATE

静态函数调用

為{幸葍}努か 提交于 2020-01-18 02:42:18
静态函数 # include <iostream.h> class Point { public : void output ( ) //非静态成员函数 { } static void init ( ) //静态成员函数 { } } ; 调用1:非静态成员函数和非静态成员属于对象的方法和数据,也就是先产生类的对象,然后通过类的对象去引用。 void main ( ) { Point pt ; pt . init ( ) ; //编译成功 pt . output ( ) ; //编译成功 } 调用2:静态成员函数和静态成员变量属于类本身,在类加载的时候,即为它们分配了空间,所以可通过类名::函数名,类名::变量名来访问。 void main ( ) { Point :: init ( ) ; //编译成功。不属于某个具体的对象,Point类没有构造对象之前,init已经存在,即分配了代码区空间。 Point :: output ( ) ; //编译失败。非法调用非静态成员函数,即Point构造对象后,output才存在。 } 调用3:静态成员函数只能调用静态成员变量。 # include <iostream.h> class Point { public : void output ( ) //非静态成员函数 { x = 0 ; y = 0 ; } static void init

Java中static的作用总结

独自空忆成欢 提交于 2020-01-16 07:49:10
1、深度总结    引用一位网友的话,说的非常好,如果别人问你static的作用;如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的;如果是说 可以构成 静态代码块,那别人认为你还可以; 如果你说可以构成 静态内部类, 那别人认为你不错;如果你说了静态导包, 那别人认为你很OK;   那我们就先在这几方面一一对static进行总结;然后说一些模糊的地方,以及一些面试中容易问道的地方; 1)static方法   static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。   但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。举个简单的例子:   在上面的代码中,由于print2方法是独立于对象存在的,可以直接用过类名调用。假如说可以在静态方法中访问非静态方法/变量的话,那么如果在main方法中有下面一条语句:   MyObject.print2();   此时对象都没有,str2根本就不存在,所以就会产生矛盾了。同样对于方法也是一样