重载函数

ViewPager,PagerAdapter总结

筅森魡賤 提交于 2019-12-05 23:33:43
在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动。不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希望能够通过调用 mAdapter.notifyDataSetChanged() 来触发 Fragment 页面使用新的数据调整或重新生成其内容,可是当我调用 notifyDataSetChanged() 后,发现什么都没发生。 搜索之后发现不止我一个人碰到这个问题,大家给出的解决办法五花八门,有些确实解决了问题,但是我总感觉问题没搞清楚。于是我决定搞明白这个问题到底是怎么回事,以及正确的用法到底如何。要搞明白这个问题,仅仅阅读文档并不足够,还需要阅读相关几个类的相关方法的实现,搞懂其设计意图。下面就是通过阅读源代码搞明白的内容。 【ViewPager】 ViewPager 如其名所述,是负责翻页的一个 View。准确说是一个 ViewGroup,包含多个 View 页,在手指横向滑动屏幕时,其负责对 View 进行切换。为了生成这些 View 页,需要提供一个 PagerAdapter 来进行和数据绑定以及生成最终的 View 页。 setAdapter() ViewPager 通过 setAdapter() 来建立与 PagerAdapter 的联系。这个联系是双向的,一方面

160、闭包、高阶函数、重载、多态、原型链、标记清除

本秂侑毒 提交于 2019-12-05 23:04:14
1、闭包 定义来源1:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures 定义本身1:内部函数可以访问外部函数作用域,外部函数不能直接访问内部函数的作用域,即函数内部不会受外部干扰。函数的这种机制叫做闭包。 定义来源2:《JavaScript高级程序设计》第178页 定义本身2:有权(能夠)访问另一个函数作用域中的变量的函数。 闭包的特征:函数中的函数 好处:闭包可以作为返回值被函数外部的变量引用,这样函数外部就可以访问函数内部的变量,减少全局变量。 坏处:导致函数的作用域不能释放,占用内存。 2、高阶函数 定义:操作其他函数的函数,比如map、forEach 3、关于重载 Java可以为一个函数定义两个定义,只要这两个定义的签名(参数的类型和数量)不同即可。JS没有签名,所以不能重载。 4、多态 同一操作作用于不同的对象上面,可以产生不同的执行结果。比如你说“叫”,鸭子听了会发出“嘎嘎声”,鸡听了会发出“咯咯声”。 5、原型链 var obj = {} function fn(){} //1、对象与函数的原型 obj.__proto__ === Object.prototype; fn.__proto__ === Function.prototype; fn.prototype={}; fn

vc中new和delete操作符的重载

跟風遠走 提交于 2019-12-05 19:50:31
在C++中重载new和delete操作符可以给程序带来更灵活的存储控制,对于游戏设计等对效率要求较高的应用而言是必不可少的。一般的C++书籍中也会介绍它们的应用和实现,然而在VC中实现却有几个必须注意的地方,否则编译会出现问题。 1. 实现 首先,vc在每个自动生成的cpp文件中都会加入如下代码: #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif 从上面红色的字体可以看出,这时的new在debug模式下被定义成了DEBUG_NEW,所以实现new函数的代码应该放在此定义之前,否则编译会报错。 那么DEBUG_NEW又是什么东西呢?在afx.h文件中可以找到答案: #define DEBUG_NEW new(THIS_FILE, __LINE__) 因而,在debug模式下如果我们调用如下代码: CWnd* pWnd = new CWnd; 就变成了 CWnd* pWnd = new(THIS_FILE, __LINE__) CWnd; 上面的代码相当于调用了new(sizeof(CWnd), THIS_FILE, __LINE__)函数,它的原型为: void* operator new(size_t, LPCTSTR, int);

c++重载部分运算符以及输入输出运算符

梦想与她 提交于 2019-12-05 18:56:09
1 #include<iostream> 2 using namespace std; 3 struct tree{ 4 int num; 5 string s; 6 bool operator<(const tree &a)const 7 { 8 return a.num<num; 9 } 10 friend bool operator>(const tree a,const tree b) 11 { 12 return a.num<b.num; 13 } 14 bool operator==(const tree &a)const 15 { 16 return a.num==num; 17 } 18 tree operator+(const tree &a)const 19 { 20 tree t; 21 t.num=num+a.num; 22 t.s=s+a.s; 23 return t; 24 } 25 friend istream &operator>>(istream &in,tree &t) 26 { 27 in>>t.num>>t.s; 28 // return in; 29 } 30 friend ostream &operator<<(ostream &out, tree &t) 31 { 32 out<<t.num<<" "<<t.s<<endl; 33 //

第38 课逻辑操作符的陷阱

半腔热情 提交于 2019-12-05 17:52:49
逻辑运算的原生语义 -操作数只有两种值(true和false) -逻辑表达式不完全计算就能确定最终值---------短路规则 -最终结果只能是true或者false 首先看一个C语言的例子: #include <iostream> #include <string> using namespace std; int func(int i) { cout << "int func(int i) : i = " << i << endl; return i; } int main() { if( func(0) && func(1) ) { cout << "Result is true!" << endl; } else { cout << "Result is false!" << endl; } cout << endl; if( func(0) || func(1) ) { cout << "Result is true!" << endl; } else { cout << "Result is false!" << endl; } return 0; } 这个例子运行结果与我们分析的一致。 看下面这个例子:会颠覆你的认知。 #include <iostream> #include <string> using namespace std; class Test { int

第34课 数组操作符的重载

风格不统一 提交于 2019-12-05 12:03:43
string类对象还具备C方式字符串的灵活性吗?还能直接访问单个字符吗? string类最大限度的考虑了C字符串的兼容性 可以按照使用C字符串的方式使用string对象 #include <iostream> #include <string> using namespace std; int main() { string s = "a1b2c3d4"; int n = 0; for(int i = 0; i<s.length(); i++) { if(isdigit(s[i])) { n++; } } cout << n << endl; } 从上面的例子可以看出,string类对象是支持数组的下标访问的? 问题:难道类的对象也支持数组的下标访问? 举个简单的例子: #include <iostream> using namespace std; class Test { }; int main() { Test t; cout << t[0] << endl; } 说明C++编译器并不认可将数组访问操作符和任意的类对象共同使用。 被忽略的事实: -数组访问操作符是C/C++中的内置操作符(和+ - * /地位是一样的) -数组访问符的原生意义是 数组访问 和 指针运算 a[n]<----->*(a+n) <----->*(n+a) <---->n[a] 指针与数组的复习

Java—重写与重载的区别

我只是一个虾纸丫 提交于 2019-12-05 09:00:32
1.重写(Override) 子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除了子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写 ,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。 总结: 1.发生在父类与子类之间 2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常 2.重载(Overload) 在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。 总结: 1.重载Overload是一个类中多态性的一种表现 2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序) 3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准 3.问:重载(Overload)和重写(Override)的区别? 答: 共同点 :方法的重载和重写都是 实现多态的 方式, 区别: 1

封装、继承和多态,重写、重载等基础复习

旧街凉风 提交于 2019-12-05 05:26:11
重载overloading 1.方法名相同,形参不同(包括参数顺序不同、类型不同、个数不同); 2.方法的返回值类型可同也可不同,所以不能用返回值类型来区分重载函数; 3.重载方法与被重载的方法可以抛出不同的异常; 4.重载体现了多态的特性:调用方法时根据传递的参数不同来决定具体调用那个重载方法,这就是多态性; public class Dog { Dog() { this.bark(); } //bark()方法是重载方法 void bark(){ System.out.println(\"no barking!\"); this.bark(\"female\", 3.4); } //注意:重载的方法的返回值都是一样的, void bark(String m,double l) { System.out.println(\"a barking dog!\"); this.bark(5, \"China\"); } //不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分 void bark(int a,String n) { System.out.println(\"a howling dog\"); } public static void main(String[] args) { Dog dog = new Dog(); dog.bark(); dog.bark(

C++——函数重载

自闭症网瘾萝莉.ら 提交于 2019-12-05 05:03:37
C++中允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载 重载使一个函数可以有多种用途 参数列表的参数类型、参数个数、参数顺序,只要有一个不同就叫做参数列表不同 函数重载仅仅是语法层面的,本质上他们还是不同的函数,占用不同的内存,入口地址也不同 来源: https://www.cnblogs.com/cxc1357/p/11908387.html

模板重载or编译器的小技巧

六月ゝ 毕业季﹏ 提交于 2019-12-05 02:41:25
最近在思考怎样在C++中方便的实现委托,看了很多文章,但由于C++中对类非静态成员函数指针的调用比较特殊,一直以来没有找到很好的方法实现,直到最近在CodeProject上看到一篇关于C++中委托实现的方法,惊叹于作者高深的程序艺术,竟然可以重载模板类,通过同一个类来实例化多个不同参数个数,不同参数类型的函数指针,实现封装调用函数,最终实现委托,原文连接为http://www.codeproject.com/cpp/FastDelegate.asp 俺试着学习了其中一些方法(只能看懂一部分 - -!),成果如下 类成员函数调用的实现: // 首先声明该需要重载的模板类 // 注意:此处的类型Signature非常特殊,在后面的定义中编译器即把重载的所有类型声明参数看做是一个参数 // 编译器会将<C, R ( T1, T2 ... TN ) >中的所有参数匹配到声明中来 // 其中:C对应于声明中的C, 而R ( T1, T2 ... TN )看作是一个类型参数Signature // 只有这样才能编译通过,否则重载不成功,编译器会报too many template arguments错误 // C为类类型, Signature为类成员函数指针类型( R (T1, T2 ... Tn) ) template<class C, typename Signature> class