静态成员

C++面向对象 静态成员和友元

删除回忆录丶 提交于 2019-12-04 03:50:56
第十一章 静态成员和友元 11.1 静态成员 1.C++类当中的静态数据成员仍借用保留字static,但是与之前的静态全局变量,静态局部变量以及静态函数没有关系。 2.静态数据成员不占用具体对象的数据空间。 3.静态数据成员的创建和销毁处分权不属于任何对象。对象有权利读和写静态成员。静态成员应该在创建任何具体对象之前就可以访问,所以要求静态成员在创建类的任何对象 之前就要存在(犹如全局变量、全局对象在main函数前面执行一样)因此静态数据成员应该在主函数之前先定义初始化。 4.静态数据成员不能没有定义也不能不定义。应该将类的静态数据成员定义和初始化语句放在类的内部实现源文件当中。 格式为: 数据类型 类名::静态数据成员名=初始化值; 或者:  数据类型 类名::静态数据成员名(初始化值); (在这里不能再写保留字static) 5.静态数据成员的生命期是全局的,与是否创建了对象没有关系。 6.要访问静态数据成员的时候,可以用对象访问也更一般是用类名访问。 对象名.静态数据成员名 类名::静态数据成员名 7.静态成员函数的声明语法格式: static 返回类型 静态成员函数名(形式参数表)在类体外定义的时候不能添加保留字static! 8.静态成员函数可以被该类所有对象所使用,但是注意静态成员函数没有隐含传递所谓的“本对象地址”的指针形式参数this,只能显式地传递对象作为参数。

Java之static作用的深度总结

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

c#基础学习(0708)之静态类

匿名 (未验证) 提交于 2019-12-03 00:40:02
再静态类中,所包含的所有成员都是“静态成员” 不是所有的静态成员都必须卸载静态类中 静态成员时属于“类”的,不是属于具体“对象”的,所以访问静态成员的时候不能通过对象来访问(对象。属性名),只能通过“类名”来直接访问静态成员。 在程序的任何一个地方访问该静态成员,其实访问的都是同一块内存,有一个地方把该值改变,则所有地方获得的值都变了。 静态成员的数据直到程序退出后才会释放资源,而实例对象,只要使用完毕就可以执行垃圾回收。 类中的静态成员在第一次使用静态类的时候进行初始化 静态构造函数的特点: 静态构造函数不能手动来调用,而是在第一次使用静态成员的时候自动调用,所以不能为静态构造函数添加访问修饰符,默认为peivate 因为静态构造函数时系统自动调用的,所以也不需要(不能)添加任何参数 静态构造函数只执行一次 在第一次使用静态类或者静态成员的时候执行 多态 多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的变成,以适应需求的不断变化 进行类型转换的另外一种方式(as) 通过as的方式进行类型转换,即便转换失败也不会报异常,而是返回一个null Person p=new Student(); Student s=p as Student; if(s!=null) { Console.WriteLine("转换成功!") } else

实验4 静态成员与友元(P281)

匿名 (未验证) 提交于 2019-12-03 00:30:01
实验目的和要求 了解成员函数的特性,掌握静态成员、友元等概念。 实验内容 1. 调试下列程序,写出输出结果,并分析输出结果。 [cpp] view plain copy using namespace class public int static void private int static int void "A=" "B=" int int return } 输出结果如下图所示: 分析:非静态数据成员从属于某个类,而静态数据成员从属于整个类。执行语句1时调用构造函数,使得对象P、Q的数据成员A的值分别是6和8,因此fun ()中输出数据成员A的值分别是6和8。数据成员B的初始值为100,执行语句1,创建对象P,B的值改变为94,再创建对象Q时,B的值改变为86,因此fun()中输出的数据成员B的值都是86,所以输出结果为A=6 B=86 A=8 B=86。 2. 分析并调试程序,完成下列问题。 (1)指出所有的构造函数,它们在本程序中分别起什么作用? (2)指出设置默认参数的构造函数。 (3)指出友元函数,将友元函数放在私有部分,观察结果是否有变化。 dist() 放到私有部分,编译程序发现结果仍然是正确的。这是因为友元函数是一个在类里声明的普通函数, 声明位置 可在类的任何部位,即可在public区也可在private区和protected区,意义完全一样

第三次课后习题

匿名 (未验证) 提交于 2019-12-03 00:30:01
一填空题 (1) 类定义中关键字private.public 和protected 以后的成员的访问权限分别是 。如果没有使用关键字,则所有成员默认定义为 权限。具有 访问权限的数据成员才能被不属于该类的函数所直接访问。 (2)定义成员函数时,运算符“::”是 运算符,“MyClass::"用于表明其后的成员函数是在“ ”中说明的。 (3)在程序运行时,通过为对象分配内存来创建对象。在创建对象时,使用类作为 ,故称对象为类的 。 (5)对于任意一个类,析构函数的个数最多为 。 (6) 运算行通常用于实现释放该类对象中指针成员所指向的动态存储空间的和任务。 (7)C++程序的内存格局通常分为4个区 、 、 和 。 (8)数据定义为全局变量,破坏了数据的 ,较好的解决办法是将所要共享的数据定义为类的 静态成员 。 (9)静态数据成员和静态成员函教可由 函数访问。 (10) 和 统称为友元。 (11)友元的正确使用能提高程序的 ,但破坏了类的封装性和数据的隐蔽性。 (12)若需要 把一个类A定义为一个类B的友元类,则应在类B的定义中加入一条语句: 二、选择题(至少选一个,,可以多选) (1)以下不属于类存取权限的是(B)。 (2)有关类的说法不正确的是(BC )。 A.类是一种用户自定义的数据类型 B.只有类的成员函数才能访向类的私有数据成员 C.在类中,如不做权限说明

为什么静态成员、静态方法中不能用this和super关键字

匿名 (未验证) 提交于 2019-12-03 00:30:01
为什么静态成员、静态方法中不能用this和super关键字 。。。学习窗体程序的时候。。。的梗 整理了一些百度下的笔记 为什么静态成员、静态方法中不能用this和super关键字 1. super 1.super this this super 2. 3. 1. 2. super super super 2. this , . this , , , , 3. 4. static “ . ” " " this super this super 5. this super this super 6. this 文章来源: 为什么静态成员、静态方法中不能用this和super关键字

C++静态成员函数访问非静态成员的几种方法

匿名 (未验证) 提交于 2019-12-03 00:26:01
转自 https://www.cnblogs.com/rickyk/p/4238380.html 大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 class A { public : static void test () { m_staticA += 1 ; } private : static int m_staticA; int m_a }; 此时你的test函数只能去访问m_staticA成员,而不能去访问m_a。同学可能会问,这算什么问题?问题都是在应用场景中才能体现的,我一开始也是不以为意,直到我遇到了回调函数这个烦人的问题我才真正静下心来去考虑这个知识点。 先简单说下回调,在座的应该都知道回调的含义,在C中回调主要体现就是回调函数,当然C++中也有仿函数等其他用法,抛开这些,单纯在回调函数这个点上我们进行如下讨论。 由于C++类的成员函数都隐含了this指针,如果我直接注册,比如 typedef void (A::*FunPtr)(); FunPtr p = A::hello; p(); 此时程序会报错,提示信息是你缺少一个this指针,意味着你要真的想使用p,你必须有一个分配好空间的实例才能来调用

类中静态成员函数的使用

匿名 (未验证) 提交于 2019-12-03 00:15:02
类中静态成员函数一般对静态成员调用 ,而要调用其非静态成员时,则类似于函数形参引用类一样(然其有一种情形,即不建立类对象,亦可引用静态成员函数,如:STATIC_A::disp( );),其代码如下: #include "stdafx.h" #include using namespace std; class STATIC_A{ public: STATIC_A (); ~STATIC_A (){}; void plus(){ c=c+100; }; static void disp(STATIC_A &w); public: int a; float b; static int c; }; int STATIC_A::c=100; STATIC_A::STATIC_A (){ //构造函数一般给变量一个初始值 a=100; b=10*a; }; void STATIC_A::disp(STATIC_A &w){ w.plus(); //调用类中普通成员函数 cout<<"a="<<w.a<<"\t"<<"b="<<w.b<<"\t"<<"c="<<c<<endl; //注意c变量与a、b变量使用异同 }; int _tmain(int argc, _TCHAR* argv[]) { const int t=6; STATIC_A A[t]; //使用数组结构的类 for

面试问题之C++语言:说一下static关键字的作用

匿名 (未验证) 提交于 2019-12-02 23:57:01
1、全局静态变量   在全局变量加上关键字static,全局变量就定义成一个全局静态变量,存放于静态存储区,在整个程序运行期间一直存在;未经初始化的全局静态变量会被自动初始化为0;全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。 2、局部静态变量   在局部变量之前加上关键字static,局部变量就成为一个局部静态变量,局部静态变量只初始化一次。作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。 3、静态函数   在函数返回类型前加static,函数就定义为静态函数。函数的定义和声明在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;   注意:不要在头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰。 4、类的静态数据成员   在类中,静态数据成员可以实现多个对象之间的额数据共享,并且使用静态数据成员还不会破坏隐藏的原则

静态数据成员和函数

匿名 (未验证) 提交于 2019-12-02 23:52:01
( 1)静态数据成员在同一个类的实例之间可以共享,如果不想让它共享,可以将它设为私有的或保护的。 (2)静态成员函数可以通过类名和对象名来调用, (3)静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态成员,必须通过对象名。 (4)当static修饰全局变量和函数时,该函数和全局变量只能在本文件中使用。 (5)被static修饰的成员函数是不分配空间的。 (6)被static修饰的数据成员在类外初始化,通过类名来访问。 (7)被static修饰的成员函数的调用(类名::函数名()). (8)静态成员函数没有this指针,因为它不属于任何一个具体的对象。 (9)静态成员函数不能被声明为虚函数或volatile。