fun函数

C++虚函数表和对象存储

天大地大妈咪最大 提交于 2019-11-30 13:33:30
C++虚函数表和对象存储 C++中的虚函数实现了多态的机制,也就是 用父类型指针指向其子类的实例 ,然后通过父类的指针调用实际子类的成员函数,这种技术可以让父类的指针有“多种形态”,这也是一种泛型技术,也就是 使用不变的代码来实现可变的算法 本文不再阐述虚函数的使用方法,而是从虚函数的实现机制上做一个清晰的剖析 参考博文: https://blog.csdn.net/u012879957/article/details/81027287 想了解实现机制,就必须先了解对象的存储方式 对象数据和函数的存储方式 我们知道,用类去定义对象,系统会为每一个对象分配存储空间 在你的印象中类的存储可能是下图这样的: 上图表示要分别为对象的数据和函数的代码分配存储空间,这样肯定是不行的,内存利用率太低了,所以C++编译系统采用的是以下的方法: 每个对象占用存储空间的只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分),函数代码属于公用部分 我们常说的“A对象的成员函数”,是从逻辑的角度而言的,而成员函数的物理存储方式其实不是如此 C++内存分区 C++的内存分区大概分成五个部分: 栈(stack):是由编译器在需要时自动分配,不需要时自动清除的变量存储区,通常存放局部变量、函数参数等。 堆(heap):是由 new 分配的内存块,由程序员释放(编译器不管),一般一个 new 与一个

JS

给你一囗甜甜゛ 提交于 2019-11-30 10:26:00
JS的数据类型 string/number/boolean/null/undefined 值类型 objict/array/function 引用类型 对象 使用一种抽象的概念去描述,人{属性,方法} var car={type:“BYD”,model:500,color:white,do:function(){可以跑}} 针对对象属性的使用 name=car.type; color=car["color"] 针对对象方法的使用 deal=car.do() 无参函数 function fun() {语句体; } 有参函数 的function fun(a,b) { 函数体; //体现对a,b处理 } 有返回值函数 function fun(){ return 返回结果 } 函数的定义和使用 <script type="text/javascript"> var person={ fname:"h", lname:"qw", //前面两个是属性 aneme:function() {//定义的函数,是person对象的动作,行为,方法 return this.fname+" "+this.lname; }, eat:function(){ alert('eat'); } }; document.getElementById(’test‘).innerHTML=person.aname()

C++—多态与继承

房东的猫 提交于 2019-11-30 09:32:46
一、基本概念 1、类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类的过程就是 类的派生 。原有的类称为 基类或父类 ,产生的新类称为 派生类或子类 。 2、派生类的声明: class 派生类名:继承方式 基类名1, 继承方式 基类名2,...,继承方式 基类名n { 派生类成员声明; }; 3、一个派生类可以同时有多个基类,这种情况称为 多重继承 ,派生类只有一个基类,称为 单继承 。直接派生,间接派生。 4、继承方式规定了如何访问基类继承的成员。继承方式有public, private, protected。如果不显示给出继承方式,默认为private继承。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。 5、 派生类继承基类中除 构造和析构 函数以外的所有成员 。 6、派生类生成: 吸收基类成员(除构造析构函数以外的所有成员); 改造基类成员(根据继承方式调整基类成员的访问,函数在子类中的覆盖,以及虚函数在子类中的覆盖); 添加新的成员; 7、公有继承 当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问。即基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员。派生类的其他成员可以直接访问它们。 无论派生类的成员还是派生类的对象都无法访问基类的私有成员 。 8、私有继承

c++第二次作业

蹲街弑〆低调 提交于 2019-11-29 17:44:19
一.为什么要用函数 一个较为复杂的系统往往需要划分为若干子程序,然后对这些子程序分别进行开发和调试。在c++语言中这些子程序体现为函数。通常将相对独立的、经常使用的功能抽象为函数。函数编写好后,可以被重复使用。 使用函数的好处: (1)有利于代码重用。 (2)可以提高开发效率、增强程序的可靠性。 (3)便于分工合作和修改维护。 例:计算阶乘m!/((m-n)!*n!) 在下面的程序中反复调用函数fun,增加代码的可读性。 #include<iostream> using namespace std; int fun(int a) { int i,sum=1; for (i = 1; i <= a; i++) { sum = sum * i; } return sum; } int main() { int m, n; cin >> m >> n; cout << "m!/((m-n)!*n!)=" << fun(m) / (fun(m - n) * fun(n)); cout << endl; return 0; } 二.为什么要使用函数重载 函数重载的定义:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。 例:求两整数的平方和及两实数的平方和 #include<iostream> using

Kotlin 入门基础语法学习笔记

跟風遠走 提交于 2019-11-29 14:07:34
敲了一天的kotlin基础语法,整理归纳到一个类里面,便于以后忘记的时候复习。 /** * Created by GG on 2017/11/20. */ //main函数 fun main(args: Array<String>) { var testMain = TestMain() print(testMain.array()) } class TestMain { //单例的写法 companion object { @Volatile var instance: TestMain? = null get() { if (field == null) { synchronized(TestMain::class.java) { if (field == null) field = TestMain() } } return field } } //变量定义 var name: String = "" //常量数组int[][][] arrs = new int[3][2][1]; val arrs = Array(3) { Array(2) { IntArray(1) } } val list = arrayListOf(String)//arrayListOf("a","b") //返回一个String fun testFun(name: String) { this

Android开发-Kotlin入门-2019-07-15

拜拜、爱过 提交于 2019-11-29 14:01:52
shankes 博客访问链接: CSDN : shankes的博客 简书 : shankes 码云: shankes.gitee.io github: sankes.github.io Android开发-Kotlin入门 文章目录 Android开发-Kotlin入门 1.基础语法 1.1 变量 1.2 函数 1.3 字符串模版 1.4 条件表达式 1.5 可空值及 *null* 检测 1.6 *for* 循环 1.7 *while* 循环 1.8 *when* 表达式 1.9 *range(in)* 区间 1.10 集合 1.11 类 2 习惯用法 2.1 创建 DTOs(POJOs/POCOs) 2.2 类型判断 2.3 遍历 map/pair型list 2.4 区间 2.5 *list* 2.6 *map* 2.7 延迟属性 2.8 扩展函数 2.9 创建单例 2.10 缩写 感谢 1.基础语法 回到顶部 gitHub 1.1 变量 val 只读变量 val 定义。只能赋值一次 //sampleStart val a: Int = 1 // 立即赋值 val b = 2 // 自动推断出 `Int` 类型 val c: Int // 如果没有初始值类型不能省略 c = 3 // 明确赋值 //sampleEnd println("a = $a, b = $b, c = $c

E004Web学习笔记-JavaScript(二):JS对象

此生再无相见时 提交于 2019-11-28 22:40:38
一、Function 1、概述 是一个函数对象; 2、Function:函数(方法)对象 ①创建 //1、方法1(不建议使用) var fun = new Function(形参列表,方法体); 示例: var fun = new Function("a","alert(a)"); fun(2); //2、方法2(掌握-常用) function 方法名称(形式参数列表){ 方法体 } 示例: function say(a){ alert(a); } say("哈哈哈哈"); //3、方法3(掌握) var 方法名 = function(形式参数列表){ 方法体 } 示例: var la = function(a){ alert(a); } la("哈哈哈哈哈哈哈"); ②方法 ③属性 length:代表形参的数量; ④特点 1、方法定义时,形参的数据类型不用写; 2、方法是一个对象,如果定义名称相同的方法不会保存,后面的方法会把前面的覆盖; 3、在JS中,方法的调用只与方法的名称有关,与所传参数无关; 4、在方法声明中,有一个隐藏的内置对象,是个数组,叫做arguments,封装所有参数; 4的运用例子: <script type="text/javascript"> function add(){ var sum = 0; for(var i=0;i<arguments

Kotlin的快速入门

喜欢而已 提交于 2019-11-28 22:20:22
Kotlin 快速入门: Kotlin 的 Hello World : #hellokotlin.kt fun main(args:Array<String>){ println("hello kotlin!"); } Kotlin 的 变量和常量 : 1 // eclipse 中运行的快捷键是 ctrl + f11 2 fun main(args:Array<String>){ 3 var i = 18; //变量 4 println(i); 5 6 val number = "No.123456"; //Val is can't be reassigned! //不能再被修改了 7 8 println(number); 9 // number = "No.159"; //此时不可以再被修改了 Kotlin的 常见容器的类型: 1 // eclipse 中运行的快捷键是 ctrl + f11 2 fun main(args:Array<String>){ 3 4 var i = 18; //这时是自动推断类型 5 6 var j:Int = 20; //显式指定j 的类型为Int 7 } 常见数据类型的取值范围 : 1 fun main(args:Array<String>){ 2 //Byte 的取值范围 3 println(Byte.MAX_VALUE) 4 println

2019/8/25 C语言回顾(8)

此生再无相见时 提交于 2019-11-28 13:39:53
一、函数 函数是功能性代码的集合,通常情况下函数需要返回值 1、函数声明 返回值类型 函数名(形参); 不写声明会有警告,或者可以将函数定义拿到main函数上方 2、函数调用 函数名(实参); 3、函数定 { c语句块; return ; } 形参:一定是变量,用来接收实参的值 实参:可以是变量,也可以是常量 二、函数传参 1、赋值传参 把值拷贝一份,对拷贝的值修改不会影响原来的值 2、地址传参 将某一个数据的地址传参,通过地址修改数据会改变原来的数据 一般情况下不要将全局变量作为传参 【1】数组传参 一维数组传参 int a[3] = {1,2,3}; 1、一种形式 int fun(int a[3]) { return 0; } fun(a); 2、第二种形式 int fun(int *p) { return 0; } 二维数组传参 int a[2][3] = {{1,2,3},{4,5,6}}; fun(a); int fun(int a[2][3]) // int (*p)[3] int fun(int (*p)[3]) 指针数组传参 int *a[3] ={}; fun(a); int fun(int *a[]) int fun(int **p) 【2】返回值为指针的函数 注意:返回的地址不可以是一个非静态局部变量的地址,当函数调用结束之后,该地址里面的内容随时会被改变

委托和lambda表达式,Action和Func

删除回忆录丶 提交于 2019-11-28 10:48:18
转自博客园(殉殇) 委托和lambda表达式,Action和Func 1、为什么要用委托 我们为什么要有委托?任何东西存在即合理,不合理的也会被时间淘汰掉,委托既然存在肯定有存在的必要,我们来看一下什么时候可以用到委托。 接下来我们有个需求,就是调用一个方法,取出1-1000个数字中所有是10的倍数的数字 public static List<int> GetNum() { List<int\> lst = new List<int>(); //这个算法是最简陋的,但是举这个例子是最合适的 for (int i = 1; i < 1000; i++) { if (i%10==0) { lst.Add(i); } } return lst; } 这个很好写,但是如果有一天,我们的需求变了,想取出1-1000个数字中所有是8的倍数的数字,那我们应该怎么写?是不是只要将if里面的条件改为i%8==0就行了,但是有一点变动的话就修改方法,说明这个方法写的并不好,如果方法很复杂的话修改也很艰难。可能有人会说在添加一个获取是8的倍数的方法,这样的话会增加数据冗余,也就是重复的内容。 如果我们可以传递方法的话,只要传过来一个(有一个参数为int类型返回值为Boolean类型的方法),这个问题将不是问题 public static List<int> GetNum