静态函数

深入理解类

匿名 (未验证) 提交于 2019-12-03 00:43:02
类成员 成员修饰符的顺序 [特性] [修饰符] [核心声明] a)修饰符:必须放在核心声明之前,如果有多个修饰符可以是任意顺序 b)特性:必须放在核心声明和修饰符之前,如果有多个特性可以任意顺序 实例成员(是类的每个实例拥有自己各个类成员的副本) 静态字段(静态字段被类的所有实例共享) 静态函数成员 a)静态函数成员不能访问实例成员,然而,它们能访问其他静态成员 成员常量 a)用于初始化成员常量的值在编译时必须是可计算的,而且通常是一个预定义简单类型或者由它们组成的表达式 b)不能在成员常量声明以后给它赋值 常量与静态量 a)成员常量表现得像静态值,它们对类的每个实例都是"可见的",而且即使没有实例也可以使用 b)与真正的静态量不同,常量没有自己的存储位置,而是在编译时被编译器替换 c)虽然常量成员表现得像一个静态量,但不能将常量声明为static 属性 a)它是命名的类成员 b)它有类型 c)它可以被赋值和读取 d)它是一个函数成员 e)它不为数据存储分配空间 f)它执行代码 属性声明和访问器 set访问器 a)拥有一个单独的、隐式的值参,名称为value,与属性的类型相同 b)拥有一个返回类型void get访问器 a)没有参数 b)拥有一个与属性类型相同的返回类型 属性与公共字段 a)属性是函数型成员而不是数据成员,允许你处理输入和输出,而公共字段不行 b)属性可以只读或只写

特性(property)/静态方法(staticmethod)/类方法(classmethod)/__str__的用法

匿名 (未验证) 提交于 2019-12-03 00:40:02
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 1 import math 2 class Circle: 3 def __init__(self,radius): #圆的半径radius 4 self.radius=radius 5 6 @property 7 def area(self): 8 return math.pi * self.radius**2 #计算面积 9 10 @property 11 def perimeter(self): 12 return 2*math.pi*self.radius #计算周长 13 14 c=Circle(10) 15 print(c.radius) 16 print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值 17 print(c.perimeter) #同上 18 ‘‘‘ 19 输出结果: 20 314.1592653589793 21 62.83185307179586 22 ‘‘‘ 注意:此时的特性arear和perimeter不能被赋值 ‘‘‘ 抛出异常: AttributeError: can‘t set attribute ‘‘‘ 2 为什么要用property 将一个类的函数定义成特性以后,对象再去使用的时候obj.name

开源项目源码解析-Java 动态代理

半世苍凉 提交于 2019-12-03 00:40:02
Java 动态代理 本文为 Android 开源项目源码解析 公共技术点中的 动态代理 部分 项目地址: Jave Proxy ,分析的版本: openjdk 1.6 ,Demo 地址: Proxy Demo 分析者: Caij ,校对者: Trinea ,校对状态:完成 1. 相关概念 1.1 代理 在某些情况下,我们不希望或是不能直接访问对象 A,而是通过访问一个中介对象 B,由 B 去访问 A 达成目的,这种方式我们就称为代理。 这里对象 A 所属类我们称为委托类,也称为被代理类,对象 B 所属类称为代理类。 代理优点有: 隐藏委托类的实现 解耦,不改变委托类代码情况下做一些额外处理,比如添加初始判断及其他公共操作 根据程序运行前代理类是否已经存在,可以将代理分为静态代理和动态代理。 1.2 静态代理 代理类在程序运行前已经存在的代理方式称为静态代理。 通过上面解释可以知道,由开发人员编写或是编译器生成代理类的方式都属于静态代理,如下是简单的静态代理实例: class ClassA { public void operateMethod1() {}; public void operateMethod2() {}; public void operateMethod3() {}; } public class ClassB { private ClassA a; public

实验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.在类中,如不做权限说明

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:22:01
我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心。 这个文件叫做 “ 库(Libary) ”,平时我们把编译好的目标代码存储到“库”里面,要用的时候链接程序帮我们从库里面找出来。 静态链接库: 在早期库的组织形式相对简单,里面的目标代码只能够进行静态链接,所以我们称为“静态库” , 静态库的结构比较简单,其实就是把原来的目标代码放在一起,链接程序根据每一份目标代码的符号表查找相应的符号(函数和变量的名字),找到的话就把该函数里面需要定位的进行定位,然后将整块函数代码放进可执行文件里,若是找不到需要的函数就报错退出 。 静态库的两个特点: #1链接后产生的可执行文件包含了所有需要调用的函数的代码,因此占用磁盘空间较大。 #2如果有多个(调用相同库函数的)进程在内存中同时运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多。 动态链接库: 动态链接库就是为了解决这些问题而诞生的技术,顾名思义, 动态链接的意思就是在程序装载内存的时候才真正的把库函数代码链接进行确定它们的地址,并且就算有几个程序同时运行,内存也只存在一份函数代码。   动态库的代码必须满足这样一种条件:能够被加载到不同进程的不同地址,所以代码要经过特别的编译处理

Flask 静态文件、模板文件设置

匿名 (未验证) 提交于 2019-12-03 00:15:02
需求 Flask默认的设置 静态文件的默认文件夹: static 静态文件的默认访问前缀: /static 模板文件的默认文件夹: templates 在Django项目中,如果需要访问静态文件,默认则是使用 /static 的前缀来进行访问。那么对于Flask来说,也是一样的。 那么如果需要修改默认的配置,应该怎么去设置呢? 可以在创建app的时候使用以下参数进行设置: # 实例化app,参数如下: # import_name, # static_url_path=None, # static_folder="static", # static_host=None, # host_matching=False, # subdomain_matching=False, # template_folder="templates", # instance_path=None, # instance_relative_config=False, # root_path=None, app = Flask(import_name=__name__, static_url_path='/python', # 配置静态文件的访问 url 前缀 static_folder='static', # 配置静态文件的文件夹 template_folder='templates') #

iOS 静态、全局变量、常量

匿名 (未验证) 提交于 2019-12-03 00:09:02
关键字static 两个概念:生命周期、作用域 生命周期 :这个变量能存活多久,它所占用的内存什么时候分配,什么时候收回。 作用域 :这个变量在什么区域是可见的,可以拿来用的。 static 分两种情况:修饰局部变量、修饰全局变量 1、 static 修饰局部变量 局部变量:在函数/方法/代码块内声明的变量。它的生命周期、作用域都是在这个代码块内。 局部变量 存储在栈区(stack) 一旦出了这个代码块,存储局部变量的这个栈内存就会被回收,局部变量也就被销毁。 当用 static 修饰局部变量时,变量被称为 静态局部变量 ,和全局变量,静态全局变量一样,是存储在‘静态存储区’。 存储在 静态存储区 的变量,其内存直到 程序结束 才会被销毁。 即,生命周期是整个源程序。 静态局部变量 的生命周期是整个源程序,但,作用域是声明它的代码块内。 2、 static 修饰全局变量 当全局变量没有使用 static 修饰时 其存储在静态存储区,直到程序结束才销毁。也就是其作用域是整个源程序。 我们可以使用 extern 关键字来引用这个全局变量。 当全局变量使用 static 修饰时 其生命周期没有变,依旧是在程序结束时才销毁。但是其作用域变了。现在只限于申明它的这个文件才可见。 使用 extern 关键字无法引用这个全局变量。 全局变量本来是在整个源程序的所有文件都可见, static

易错、经典问题:return不可返回指向栈内存的指针

匿名 (未验证) 提交于 2019-12-02 23:59:01
C/C++程序占用的内存分为两大类: 静态存储区 与 动态存储区 。其示意图如下所示: 数据保存在静态存储区与动态存储区的区别就是:静态存储区在 编译-链接 阶段已经确定了,程序运行过程中不会变化,只有当程序退出的时候,静态存储区的内存才会被系统回收。动态存储区是在程序运行过程中动态分配的。 在其它地方我们还可以看到内存分配还有其他分类,那些都是细分的分类,比如文字常量区、全局数据区等,都归为静态存储区这一个大类。 关于内存的分类这里只是大致说明一下,关于内存更详细的内容可查看往期笔记: 【C语言笔记】内存笔记 先看一个return返回指向栈内存指针的例子: #include <stdio.h> char * GetStr ( void ) { char p [] = "Hello" ; /* 保存在栈中 */ return p ; } int main ( void ) { char * str = NULL ; str = GetStr (); printf ( "%s\n" , str ); return 0 ; } 程序编译、运行的结果如下: 可以看到,编译出现警告: warning: function returns address of local variable 运行结果并不是我们期望的输出字符串 Hello 。 那是因为 GetStr 函数返回指向栈内存的指针