精华内容
下载资源
问答
  • c++引用举例

    2019-12-03 20:22:19
    c++引用举例 题一 #include <iostream> using namespace std; class A{ public: int x; int getX() { return x; } }; void swap(// 在此处补充你的代码) { int tmp = a.x; a.x = b.x; ...

    c++引用举例

    题一
    #include <iostream>
    using namespace std;
    class A{
    public:    
        int x;    
        int getX() { return x; }    
    };
    void swap(// 在此处补充你的代码)
    {    
        int  tmp = a.x;    
        a.x = b.x;    
        b.x = tmp;
    }
    int main()
    {   
        A a,b;    
        a.x = 3;    
        b.x = 5;  
        swap(a,b);  
        cout << a.getX() << "," << b.getX();    
    return 0;
    }
    

    【样例输入】无
    【样例输出】5,3

    答案:

    #include <iostream>
    using namespace std;
    class A{    
    public:  
        int x; 
        int getX() { return x; }    
    };
    void swap( A & a, A & b) //考察定义到类型的问题 
    {    
        int  tmp = a.x;    
        a.x = b.x;    
        b.x = tmp;
    }
    int main()
    {   
        A a,b;   
        a.x = 3; 
        b.x = 5;    
        swap(a,b);   
        cout << a.getX() << "," << b.getX();    
    return 0;
    }
    题二
    #include <iostream>
    using namespace std; 
    void swap(// 在此处补充你的代码)
    {  
       int * tmp = a;    
       a = b;    
       b = tmp;
    }
    int main()
    {  
       int a = 3,b = 5;    
       int * pa = & a;   
       int * pb = & b;    
       swap(pa,pb);    
       cout << *pa << "," << * pb;    
    return 0;
    }

    【样例输入】无
    【样例输出】5,3

    答案:

    #include <iostream>
    using namespace std; 
    void swap(int *& a,int *& b)
    {  
       int * tmp = a;    
       a = b;    
       b = tmp;
    }
    int main()
    {  
       int a = 3,b = 5;    
       int * pa = & a;   
       int * pb = & b;    
       swap(pa,pb);    
       cout << *pa << "," << * pb;    
    return 0;
    }
    题三
    #include <iostream>
    using namespace std;
    // 在此处补充你的代码
    getElement(int * a, int i)
    {  
        return a[i];
    }
    int main()
    {  
        int a[] = {1,2,3};  
        getElement(a,1) = 10;    
        cout << a[1] ;    
    return 0;
    }

    【样例输入】无
    【样例输出】10

    答案:

    #include <iostream>
    using namespace std;
    int & getElement(int * a, int i)
    {  
        return a[i];
    }
    int main()
    {  
        int a[] = {1,2,3};  
        getElement(a,1) = 10;    
        cout << a[1] ;    
    return 0;
    }

    以上皆来源于
    MOOC程序设计与算法(三)C++面向对象程序设计 郭炜

    展开全文
  • PHP的引用举例

    2012-12-10 16:09:00
    //这里的befor 是引用$data return $this->db->insert($data,$options); } protected function before(&$data) { $pk='id'; if(!isset($data[$pk])) { $data[$pk] = $this->id($pk); } } ...

     
    mongodb 是没有  id 自增的 
    也就是 插入第一条 
    id=1
    插入第二条  id=2
     

    我们写一个mongodb类
    具体代码我就不说了 我这里就简单的列举一下
    原型  $db->insert($data=array(),$options=array()){}

    然后我们插入 数据的时候是这样的 
    $db->insert(array("test"=>"测试")); //插入成功并没有id 
    我们封装一个 insert 类

    function insert(array $data,$options=[]){
            $this->before($data); //这里的befor 是引用$data
            return $this->db->insert($data,$options);
        }
    
     protected function before(&$data) {
                 $pk='id';
                if(!isset($data[$pk])) {
             
                    $data[$pk]   =  $this->id($pk);
                }
        }
    
       
    

    来看 before 的原型 (&$data)
    检测到 $data数组不存$data['id']
    $data['id']=id()//自增字段

    来看一下id的函数 ()
    protected function id($pk) {
           $result   =  $this->find(array(),array($pk=>1))->sort(array($pk=>-1))->limit(1); //查询字段id 
            $data = $result->getNext(); //获取下一条数据
            return isset($data[$pk])?$data[$pk]+1:1; //不存在id id默认1 存在+1
        }
    

    回到刚才的插入 $db->insert(array("test"=>"测试")); 
    因为再插入之前增加了一个引用函数before
    那么 数组就变成了 array("test"=>"测试","id"=>1) //存在就是id+1

     

    展开全文
  • 对象相互持有导致循环强引用举例如反复执行任务的NSTimer对象的目标对象 又保留了计时器对象,若该NSTimer对象被目标对象持有,便必定会发生循环强引用,因为NSTimer对象会持有目标, 而该NSTimer对象又是目标...

    理解

    1. 变量
    2. 作用域
    3. 变量废弃
    4. 持有对象
    5. 释放对象
    6. 对象所有者(引用计数)
    7. 对象废弃
    8. 变量所有权修饰符对对象的影响

    对象相互持有导致循环强引用,举例如反复执行任务的NSTimer对象的目标对象
    又保留了计时器对象,若该NSTimer对象被目标对象持有,便必定会发生循环强引用,因为NSTimer对象会持有目标,
    而该NSTimer对象又是目标对象的成员变量也就是目标对象又持有该NSTimer对象
    此循环强引用会一直持续到目标对象调用NSTimer对象的invalidate方法释放该NSTimer对象
    可通过扩展NSTimer类利用block与__weak所有权修饰符解决该循环强引用

    #import<Foundation/Foundation.h>
    
    @interface NSTimer(BlocksSupport)
    
    +(NSTimer *)scheduledTimerWithTimeInterval:
    (NSTimeInterval)interval
    block:(void(^)())block
    repeats:(BOOL)repeats;
    
    @end
    
    
    @implementation NSTimer(BlockSupport)
    
    +(NSTimer *)scheduledTimerWithTimeInterval:
    (NSTimeInterval)interval
    block:(void(^)())block
    repeats:(BOOL)repeats
    {
    return [self scheduledTimerWithTimeInterval:interval
    target:self
    selector:@selector(blockInvoke:)
    userInfo:[block copy]
    repeats:repeats];
    
    }
    
    +(void)blockInvoke:(NSTimer *)timer{
    void(^block)()=timer.userInfo;
    if(block){
    block();
    }
    }
    //在别的Class类使用的时候
    -(void)startAction{
    __weak Class *weakSelf=self;//定义一个指向自己的弱引用
    _myTimer=[NSTimer scheduledTimerWithInterval:5.0 block:^{
    Class *strongSelf=weakSelf;/*块捕获该指向自己的弱引用,不直接捕获普通的self变量,因此block不持有该Class对象
    然后马上让__strong变量持有该__weak的Class对象保证实例在执行期间持续存活,
    也就是说strongSelf也是持有了Class对象的,但是,但是,但是,strongSelf是在block体
    中声明的变量,其生命周期仅存block块,在block块执行完后便释放,也就不持有Class对象了*/
    [strongSelf excueAction];    
    } repeats:YES];
    }
    
    -dealloc{
    [_myTimer invalidate];/*当外界持有Class对象的最后一个引用将其释放的时候,该方法会被执行,从而还会让计时器停止工作。
    若开发者忘记在dealloc中调用invalidate方法停止计时器,那么计时器执行的block块中的weakSelf会变成nil
    strongSelf也就指向了nil,从而计时器执行空操作。*/
    }

     

    转载于:https://www.cnblogs.com/Jk-Chan/p/5271553.html

    展开全文
  • 定义语法 外部变量值截获 改变外部变量值 ...block变量作用域导致强引用 typedef void(^BlockType)(NSString *str);//声明一个void(^)(NSString *str)的block类型,类型名为BlockType-(void)viewDidL...
    1. 定义语法
    2. 外部变量值截获
    3. 改变外部变量值
    4. block变量作用域导致block体从栈复制到堆同时变量持有了block体中截获的变量
    5. block变量作用域导致强引用

    typedef void(^BlockType)(NSString *str);//声明一个void(^)(NSString *str)的block类型,类型名为BlockType
    -(void)viewDidLoad
    {

    • int i=[self getValuesFrom:^int(int i, int y) {//算法由自己定,值由别人传入
    • return i+y;
    • }];//拿到经自己算法的结果
    • NSLog(@"i=%d",i);
    • __block int test=100;
    • NSLog(@"test is:%d",test);//100
    • void(^block1)()=^{
    • NSLog(@"block1截获的test is:%d",test);
    • test=110;
    • };
    • NSLog(@"test is:%d",test);//100
    • test+=1;
    • NSLog(@"test is:%d",test);//101
    • void(^block2)()=^{
    • NSLog(@"block2截获的test is:%d",test);
    • test=120;
    • };
    • NSLog(@"test is:%d",test);//101
    • test+=1;
    • NSLog(@"test is:%d",test);//102
    • block1();//执行了block1,输出test为102,把test的值改变为110
    • NSLog(@"test is:%d",test);//110
    • test+=1;
    • NSLog(@"test is:%d",test);//111
    • block2();//执行了block2,输出test为111,把test的值改变为120
    • NSLog(@"test is:%d",test);//120
    • test+=1;
    • NSLog(@"test is:%d",test);//121
      • /*
      • 得出结论,block截获外部变量值不是看block体实现的时候截获的,而是在执行block的时候,会把执行时当前外部变量值截获,
      • 所以不存在担心实现的时候外部变量是这个值,到执行block的时候外部变量值变成另外的,即使多个block用到了同一个外部变量值,因为无论多少个地方用到了,同一刻操作该变量的只能有一个地方,并且block是在执行时才截获该值。不过也应注意外部变量值的截获是在
      • 执行时才截获这个原则。
      • block内对外部变量的赋值操作会影响外部变量的实际结果。
      • */
    • void(^testIsCanHoldSelf)()=^{
    • NSLog(@"self is %@",self);
    • };
    • testIsCanHoldSelf();
      • /*
      • 不会引起强引用,因为testIsCanHoldSelf的作用域为viewDidLoad函数,
      • testIsCanHoldSelf变量被废弃时,testIsCanHoldSelf截获的self持有权也会被释放
      • 若把testIsCanHoldSelf声明为类的strong成员变量,就会导致循环引用,因为
      • testIsCanHoldSelf为强引用变量的话,block体在赋值给testIsCanHoldSelf的时候,block体
      • 从栈复制到堆,block体截获了self或者只截获了self中的成员变量,
      • testIsCanHoldSelf也持有self,
      • self又持有testIsCanHold成员变量.
      • 如果想通过把testIsCanHoldSelf声明为__weak类型的话,那么block体在生成的时候赋值给
      • __weak 的testIsCanHoldSelf,没变量持有该block体,那么该block体马上又被释放了,
      • (可以把block体当为对象考虑)
      • 解决该强引用的问题,让testIsCanHoldSelf变量不持有self即可,但是block需要用到self
      • 所以可以让block体截获一个__weak的self
      • __weak ViewController *weakSelf=self;
      • testIsCanHoldSelf=^{
      • NSLog(@"self is %@",weakSelf);
      • };
      • testIsCanHoldSelf();
      • */

    }


    -(NSString *)testBlock{

    • NSString *(^myBlock)(NSString *str)= ^/*NSString **/(NSString *str){
    • return str;
    • };//内嵌方法
    • return myBlock(@"testValues");

    }

    -(int)getValuesFrom:(int(^)(int i,int y))block{

    • return block(1,2);//block体内调用block

    }

    循环强引用举例以及解决方案:

    • EOCNetworkFetcher持有completion对象NSData对象,NSURL对象
    • EOCClass持有EOCNetworkFetcher对象,NSdata对象,
    • 生成completion栈对象捕获EOCClass中的NSData对象
    • 也就是间接捕获了self,
    • completion栈对象传入EOCNetworkFetcher对象被它的completion对象持有
    • EOCNetworkFetcher会把EOCClass的completion栈对象copy到堆中
    • 从而EOCNetworkFetcher对象因持有completion堆对象而持有EOCClass对象
    • 从而发生循环强引用。

    解决办法有两种:

    • 1.如果EOCClass中的EOCNetworkFetcher对象的持有者只是它本身,
      • 那么释放持有EOCNetworkFetcher对象,EOCNetworkFetcher对象没有了持有者,
      • 之后就会释放内存,从而也会释放EOCNetworkFetcher对象里面的成员变量,从而
      • EOCNetworkFetcher对象里面的completion对象不持有EOCClass中的completion,从而
      • completion对象没有持有者便释放内存从而也会释放所捕获的EOCClass对象
      • 从而循环强引用被打破了。
    • 2.如果EOCClass传入到EOCNetworkFetcher对象中的completion对象只有EOCNetworkFetcher持有,
      • 那么让EOCNetworkFetcher对象不再持有传入的completion,从而不再持有completion捕获的EOCClass对象
      • 从而循环强引用被打破了,也就是在适当的地方把EOCNetworkFetcher对象中的completion对象释放置为nil即可
      • 一般采用第二种,让提供API方来处理强引用问题而不是使用API方来处理

     

    • 如果把EOCClass中的completion捕获的对象为__weak变量呢?
      • 如果该__weak变量是在方法体中声明,那么EOCClass中的方法体执行完,__weak变量作用域超过了就释放对象
      • 所以EOCNetworkFetcher对象无法赋值EOCClass对象。
      • 如果该__weak变量是EOCClass对象的成员变量,那么传入到EOCNetworkFetcher中的时候变量还没被释放,EOCNetworkFetcher
      • 可以给EOCClass对象__weak成员变量所指的内存赋值,好像可以解决问题,但是实际上completion捕获的__weak对象
      • 需要通过EOCClass对象的self引用,此时已经捕获了EOCClass对象,所以还是解决不了问题。
    • 又或者EOCNetworkFetcher对象中的completion变量为__weak呢?
      • 这样EOCClass中的completion传入进来后,超过了作用域,EOCClass中的completion就被释放
      • 而EOCNetworkFetcher对象中的completion变量又没有持有接收到的completion对象,所以completion对象内存释放了
      • 导致EOCNetworkFetcher对象中的completion变量永远为nil

    转载于:https://www.cnblogs.com/Jk-Chan/p/5271641.html

    展开全文
  • 在了解指针前需要先了解一下什么是地址? 地址:内存地址,每个字节的编号,变量根据数据类型存储占相应空间,从首地址...引用就是给变量起了一个别名,这个引用不是动词(调用的意思),而是一个名词,就表示别名。
  • 前提该代码在HomeFragment中完成: private int page = 0; //Handler的弱引用 private static class MyHandler extends Handler { private WeakReference<HomeFragment> weakReference; public MyHandler(Hom
  • 较好的例子来源合法的一天娱乐业利用了乐意了一天了娱乐娱乐了娱乐娱乐与
  • C8051F930各个功能的详细资料,由于自己之前一直在找,网上这个资料不多,现在共享出来,希望能喜欢
  • #include using namespace std; class Triangle { private: float a, b, c; public: void Setabc(float x, float y, float z) //置三角形三边 {a = x; b = y; c = z;} void Getabc(float &...y, float &...
  • 看图: 看这两个菜单,看到不同处了吗? 一个具中,一个考上! 上面的一行就是加了vertical-align: middle的样式表! 转载于:https://www.cnblogs.com/liuwm5000/archive/2008/12/23/1360742.html...
  • 引用传递举例

    2019-10-03 20:41:50
     调用方法test2时,把list赋给listA,发生对象引用的复制。结果是,listA也指向了list所指向的对象。因为listA只是对象引用list的副本,所以执行“list=null;”后,listA不指向任何对象。只是把那个传入的值设置为...
  • 1、强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 String str = "abc"; List<String> list = new Arraylist<...
  • 1. 定义强引用、软引用和弱引用的方式 new出来的是强引用,比如String str = new String(“123” ); 弱引用: WeakReference<String> weakRef=new WeakReference<String>(str); 其中str是引用 软...
  • 引用的简单举例

    2017-04-10 14:42:14
    #include #include using namespace std; int main() {  int i=9;  int &ir=i;  cout  ir=20;  cout  i=12;  cout  return 0; }
  • Java - Lambda表达式 / 方法引用 / 构造器引用 / 数组引用(多种情况举例说明)
  • c# 引用与对象举例

    2019-10-05 15:52:43
    转载于:https://www.cnblogs.com/fanweisheng/p/11440978.html
  • c++引用--举例说明

    2017-06-07 20:57:53
    引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 c++11中新增了“右值引用”,我们这里所说的引用通常指“左值引用”。例① int a = 10; int &rea = a; //rea指向a,是a的另一个名字...
  • 主要介绍了C++中引用的本质及引用作函数参数的使用,讲解了函数返回值是引用的情况等一些难点,需要的朋友可以参考下
  • 1. 请看下程序 inline void CScanLineFill::removeOldNodeAET(AET* &aetList, const float yCurrent) { AET* pCur = aetList; AET* temp = kkk; aetList = pCur; } 转载于:https...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,938
精华内容 1,975
关键字:

引用举例