精华内容
下载资源
问答
  • 警告 1 类型库导入程序遇到无有效返回类型的属性 getter“sessionPlaylistCount”(它位于类型“WMPLib.IWMPNowPlayingHelperDispatch”上)。导入程序将尝试将此属性作为方法导入。 CodeAutoGenerator 也不知是不是...
  • 返回类型引用类型的几种情况

    千次阅读 2018-12-27 16:37:45
    引用类型: 类:返回的是该类的对象 抽象类:返回的是该抽象类的子类对象 接口: */ abstract class Person { public abstract void study(); } class PersonDemo { public Person getPerson() { //Pe....
    /*
    	返回值类型
    		基本类型:(基本类型太简单,我不准备讲解)
    		引用类型:
    			类:返回的是该类的对象
    			抽象类:返回的是该抽象类的子类对象
    			接口:
    */
    abstract class Person {
    	public abstract void study();
    }
    
    class PersonDemo {
    	public Person getPerson() {
    		//Person p = new Student();
    		//return p;
    		
    		return new Student();
    	}
    }
    
    class Student extends Person {
    	public void study() {
    		System.out.println("Good Good Study,Day Day Up");
    	}
    }
    
    class PersonTest2 {
    	public static void main(String[] args) {
    		//需求:我要测试Person类中的study()方法
    		PersonDemo pd = new PersonDemo();
    		Person p = pd.getPerson(); //new Student();  Person p = new Student(); 多态
    		p.study();
    	}
    }
    
      /*
    	形式参数:
    		基本类型(太简单,不是我今天要讲解的)
    		引用类型
    			类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象
    			抽象类:
    			接口
    */
    class Student {
    	public void study() {
    		System.out.println("Good Good Study,Day Day Up");
    	}
    }
    
    class StudentDemo {
    	public void method(Student s) { //ss; ss = new Student();  Student s = new Student();
    		s.study();
    	}
    }
    
    class StudentTest {
    	public static void main(String[] args) {
    		//需求:我要测试Student类的study()方法
    		Student s = new Student();
    		s.study();
    		System.out.println("----------------");
    		
    		//需求2:我要测试StudentDemo类中的method()方法
    		StudentDemo sd = new StudentDemo();
    		Student ss = new Student();
    		sd.method(ss);
    		System.out.println("----------------");
    		
    		//匿名对象用法
    		new StudentDemo().method(new Student());
    	}
    }
    
    
    /*
    	返回值类型
    		基本类型:(基本类型太简单,我不准备讲解)
    		引用类型:
    			类:返回的是该类的对象
    			抽象类:
    			接口:
    */
    class Student {
    	public void study() {
    		System.out.println("Good Good Study,Day Day Up");
    	}
    }
    
    class StudentDemo {
    	public Student getStudent() {
    		//Student s = new Student();
    		//Student ss = s;
    		
    		//Student s = new Student();
    		//return s;
    		return new Student();
    	}
    }
    
    class StudentTest2 {
    	public static void main(String[] args) {
    		//需求:我要使用Student类中的study()方法
    		//但是,这一次我的要求是,不要直接创建Student的对象
    		//让你使用StudentDemo帮你创建对象
    		StudentDemo sd = new StudentDemo();
    		Student s = sd.getStudent(); //new Student(); Student s = new Student();
    		s.study();
    	}
    }
    
    /*
    	形式参数:
    		基本类型(太简单,不是我今天要讲解的)
    		引用类型
    			类名:(匿名对象的时候其实我们已经讲过了)需要的是该类的对象
    			抽象类:需要的是该抽象的类子类对象
    			接口:需要的是该接口的实现类对象
    */
    //定义一个爱好的接口
    interface Love {
    	public abstract void love();
    }
    
    class LoveDemo {
    	public void method(Love l) { //l; l = new Teacher();  Love l = new Teacher(); 多态
    		l.love();
    	}
    }
    
    //定义具体类实现接口
    class Teacher implements Love {
    	public void love() {
    		System.out.println("老师爱学生,爱Java,爱林青霞");
    	}
    }
    
    class TeacherTest {
    	public static void main(String[] args) {
    		//需求:我要测试LoveDemo类中的love()方法
    		LoveDemo ld = new LoveDemo();
    		Love l = new Teacher();
    		ld.method(l);
    	}
    }
    
    展开全文
  • C++返回引用类型 指针的引用

    千次阅读 2010-11-08 22:39:00
    <br />C++返回引用类型 A& a(){ return *this;} 就生成了一个固定地址的指针,并把指针带给你 <br />但A a() { return *this;}会生成一个临时对象变量,并把这个临时变量给你 这样就多了...

    C++返回引用类型
    A& a(){ return *this;} 就生成了一个固定地址的指针,并把指针带给你

    但A a() { return *this;}会生成一个临时对象变量,并把这个临时变量给你
    这样就多了一步操作

    当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。

    问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
    int & fun() { int a; a=10; return a; }
    这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
    这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。


    指针的引用
    GetNearestFontInTwips(CFont *&aFont, const TFontSpec &aFontSpec);

    第一个参数aFont是一个指针, 前面加上*&表示指针的引用, 其实可以如下看待这个方式(CFont*) &aFont, 这就一目了然了.

    展开全文
  • 1. C++基础—有返回值类型函数(返回引用类型) 1.1 引用的定义 引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。 申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,...

    1. C++基础—有返回值类型函数(返回引用类型)

    1.1 引用的定义

    • 引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。
    • 申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不可以把该引用名作为其他变量名的别名。
    • 代码示例:

      (1)会调用拷贝构造函数和析构函数
      A a(){...;return *this;}
      
      (2)不会调用拷贝构造函数和析构函数
      A& a(){...;return *this;}
      
      当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。

      注:再次执行相关操作只能是赋值,而不是改改变引用的对象)。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。

    1.2 引用作为参数传递回顾

    • 传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
    • 使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
    • 使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用”*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰

    1.3 将引用作为函数返回值类型

    • 格式:类型标识符& 函数名(形参列表及类型说明){ //函数体 }
    • 好处:在内存中不产生被返回值的副本;
    • 示例代码一:

      
      #include <iostream>
      
      using namespace std;
      
      class A
      {
      public:
          A(){}
          ~A(){}
      
      public:
          void set_x(int x){_x=x;}
          int& get_x(){return _x;}
      
      private:
          int _x;
      };
      
      int main() 
      { 
          A *a = new A();
          a->set_x(14);
      
          int x = a->get_x();//na为新定义的变量,初始化为a->get_a()的值
          x = 24;
          cout<<"x="<<x<<", _x="<<a->get_x()<<endl;
      
          int &rx = a->get_x();//na1为引用,是a->get_a()返回变量的别名,初始化为a->get_a()的值
          rx = 24;
          cout<<"rx="<<rx<<", _x="<<a->get_x()<<endl;
      
          delete a;
      
          system("pause");
      
          return 0;
      }
      =>x=24, _x=14
        x=24, _x=24
    • 示例代码二:

      
      #include <iostream>
      
      
      #include <string>
      
      
      #include <map>
      
      using namespace std;
      
      typedef map<int, string> STR_MAP;
      class A
      {
      public:
          A(){_str_map.clear();}
          ~A(){}
      
      public:
          STR_MAP& get_str_map()
          {
              return _str_map;
          }
      
          void insert_to_str_map(int index, string name)
          {
              _str_map.insert(pair<int,string>(index, name));
          }
      
          void show_str_map()
          {
              STR_MAP::iterator iter = _str_map.begin();
              for(; iter!=_str_map.end(); ++iter)
              {
                  cout<<"index="<<iter->first<<", name="<<iter->second<<endl;
              }
          }
      
      private:
          STR_MAP _str_map;
      };
      
      int main() 
      { 
          A *a = new A();
          int i=0;
          for(; i<3; i++)
          {
              char cstr[16];
              string name(itoa(i, cstr, 16));
              a->insert_to_str_map(i, "a" + name);
          }
      
          STR_MAP str_map = a->get_str_map();
          str_map.insert(pair<int,string>(i, "b"));
          a->show_str_map();
      
          cout<<endl;
      
          STR_MAP &rstr_map = a->get_str_map();
          rstr_map.insert(pair<int,string>(i, "b"));
          a->show_str_map();
      
          delete a;
      
          system("pause");
      
          return 0;
      }
      =>index=0, name=a0
        index=1, name=a1
        index=2, name=a2
      
        index=0, name=a0
        index=1, name=a1
        index=2, name=a2
        index=3, name=b

      注:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!

    1.4 返回局部变量的引用

    • 返回局部内置类型的引用:

      
      #include <iostream>
      
      using namespace std;
      
      int& func()
      {
          int a;
          a = 10;
          return a;
      }
      
      int main() 
      { 
          int &ra = func();
          ra += 1;
          cout<<"a="<<func()<<", ra="<<ra<<endl;
          ra += 1;//变量a是局部变量,生命周期在执行函数右大括号时结束,其别名也相应结束
          cout<<"a="<<func()<<", ra="<<ra<<endl;
          system("pause");
          return 0;
      }
      =>a=10, ra=11
        a=10, ra=1448013121
      程序并未崩溃,只是输出未如预期。
    • 返回局部对象的引用:

      
      #include <iostream>
      
      
      #include <string>
      
      using namespace std;
      
      string& func()
      {
          string a;
          a = 10;
          return a;
      }
      
      int main() 
      { 
          string a = func();
          cout<<"a="<<a<<endl;
      
          string &ra = func();
          ra = "1";
          cout<<"a="<<func()<<", ra="<<ra<<endl;
      
          system("pause");
          return 0;
      }
      =>编译通过,运行报错
      提示:123.exe 中的 0x75644598 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x00b5ebe8 处的 std::bad_alloc。

      注:问题的关键是,当想要返回一个引用而不是一个拷贝时,务必要确保这个引用的有效性。比如:
      int& fun() { int a; a=10; return a; }
      或 string& fun() { string a; a=”10”; return a; }
      这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。这种情况下,如果fun的返回类型不是int&而是int(或string&是string)就没有问题了。
      因此,要返回一个引用时,“临时变量”不能是“临时”的,至少得等函数外部使用完毕这个引用之后,才能销毁它。


    参考文献:
    [1]《C++全方位学习》范磊——第十三章
    [2]《C++程序设计教程(第二版)》钱能——第五章、第六章、第七章
    [3]《C++ Primer(第5版)》王刚 杨巨峰——第一章、第六章
    [4] 百度搜索关键字:C++函数、返回引用类型

    展开全文
  • 重载运算符时的参数和返回类型要用引用的说明

    千次阅读 多人点赞 2017-07-12 16:17:04
    一·我们举个必须要用重载运算符和重载运算符时必须要使用引用的例子 #include #pragma pack(8) using namespace std; class Myclass { private: char* str; public: Myclass(char* str1 = "default string") { ...

    一·我们举个必须要用重载运算符和重载运算符时必须要使用引用的例子

    class Myclass {
    private:
    char* str;
    public:
    Myclass(char* str1 = "default string") {
    str = new char[strlen(str1) + 1];
    strcpy(str, str1);
    cout << "constructor called" << endl;
    }
    ~Myclass(){
    cout << "destrustor called"<<endl;
    }
    void showChar() {
    cout << str << endl;
    }
    Myclass &operator=(const Myclass &ele) {
    delete[] str;
    str = new char[strlen(ele.str) + 1];
    strcpy(str, ele.str);
    return *this;
    }
    };
    
    int main() {
    Myclass class1("string1");
    Myclass class2;
    class2 = class1;
    class1.showChar();
    class2.showChar();
    return 0;
    }

     

    输出:

    constructor called

    constructor called

    string1

    string1

    destrustor called

    destrustor called

     

    这里我们重载了赋值运算符,将class1的str赋给了class2.str;

    若我们不重载赋值运算符,用原来自带的‘=’,则会调用复制构造函数,将class1的str的值复制给class2的str,这是两个str指向统一内存。在程序完成时,调用析构函数,先调用class2的析构函数,把str所指向的内存给清除,完成后再调用class1的析构函数,由于在class2时已经把str所指向的内存给清除了,这时会出现内存泄漏

    为什么这里的重载赋值运算符一定要用引用?

    若参数不用引用,则有Myclass &operator=(const Myclass ele) {

    这时实参传值给形参会创建一个临时变量,调用复制构造函数将实参复制给形参,实参的str与形参的str指向同一块内存。所以,当赋值函数完成时,会清除函数的所占的内存,形参就会被清除,形参的str指向的内存也就会被清除。再调用class1.showchar()会发现内存泄漏。

    输出结果如下:

     

    constructor called

    constructor called

    䁷䁷䁷䁷䁷

    string1

    destrustor called

    destrustor called

     

    若重载运算符函数的返回类型不用引用,则有则有Myclass operator=(const Myclass &ele) {

     

    这是返回对象时会创建一个临时对象,再调用复制构造函数,将返回的对象复制给临时对象,函数结束后,返回的对象被清除,返回对象的str所指向的内存也被清除,由于返回对象和临时对象的 str指向同一块内存,所以calss2=class1的str指向一块随机内存,在调用class2.showchar()时会随机输出。

    输出结果如下:

     

    constructor called

    constructor called

    string1

    䁷䁷䁷䁷䁷

    destrustor called

    destrustor called

    此外:

    (class2=class1)=class3是不允许的,编译器不允许临时对象调用成员函数。

    因此这种情况必须要用引用来传递参数和返回参数,使用引用返回的参数可以作为左值。

    以上为学习时做的笔记,借鉴于网上各路博客大神,有雷同很正常,欢迎各位同学指正。

     

     

     

    展开全文
  • 函数返回类型是值时,这种情况是最简单的,只需满足接受返回值的变量是个同类型的左值即可。 函数返回值是指针: 一个函数可以返回一个int,float,char型的数据,也可以返回一个指针类型的数据。 使用指针函数的最...
  • class Test {  Test& operator= (const Test& t)  {  } } 这个是我们熟悉的赋值操作符函数的格式,但是该函数为什么非得要返回一个引用呢。 查阅了很多资料感觉这种解释...如果赋值操作符返回一个引用类型
  • Java引用类型

    千次阅读 2016-03-16 19:12:55
    博主最近在整理Java集合框架时,在整理到WeakHashMap的时候,觉得有必要先阐述一下Java的引用类型,故此先整理的这篇文章,希望各位多提提意见。   闲话不多说,直接进入主题。Java中提供了4个级别的引用:强引用...
  • 返回类型和return语句

    千次阅读 2015-09-14 15:08:14
    没有返回值的return语句只能用在返回类型是void的函数中,返回void的函数不要求非得有return语句,因为这类函数最后一句后面会吟诗执行return void函数可以使用return语句提前退出函数 有返回值函数 return语句...
  • java基本类型引用类型

    万次阅读 多人点赞 2018-01-04 17:30:32
    java基本类型引用类型 目录 java基本类型引用类型 目录 一基本数据类型引用类型 三基本类型引用类型的区别 默认值 内存分配 自动装箱自动拆箱 自动装箱拆箱带来的问题 程序的性能 空指针异常 ...
  • Java四种引用类型

    万次阅读 2019-05-12 19:01:34
    文章目录引用类型简介对象可达性判断GC Roots对象可达性判断可达性状态类型可达性判断规则状态转换Reference类定义状态变化四种引用类型实现强引用FinalReference软引用SoftReference弱引用WeakReference虚引用...
  • C#详解值类型引用类型区别

    万次阅读 多人点赞 2016-04-20 17:59:42
    首先,什么是值类型,什么是引用类型? 在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。 值类型(value type):byte,short,int,long,float,double,decimal,...
  • Java 基本类型引用类型

    千次阅读 多人点赞 2019-03-27 20:55:51
    Java 基本类型引用类型 一、基本数据类型 java 中一共分为 8 种基本数据类型:byte、short、int、long、float、double、char、boolean, 其中 byte、short、int、long 是整型。float、double 是浮点型,char 是...
  • java中引用数据类型有哪些?

    万次阅读 多人点赞 2016-07-18 09:45:37
    Java中有俩种数据类型,其中主要有8中基本数据类型引用数据类型,除了8中基本数据类型以外都是引用数据类型,8中基本数据类型分别是byte,short,int,long,char,boolean,float,double,具体如下:1、boolean:数据值...
  • 同时定义了按常量引用返回的 operator= 操作符和按常量引用返回的 operator= 操作符。这样是为了方便取值的只读语义和修改值的修改语义(accessor or mutator)。 正因为我们这么定义了,所以我们就可以写出下列的...
  • C++基础---函数的返回类型

    千次阅读 2015-09-04 16:38:45
    1. 函数的返回类型 1.1 函数的返回类型 C++可以把函数分为有返回值函数和无返回值函数两种。 函数的返回类型:即函数返回值的类型; 代码示例: void func()//无返回值函数 { if(boolean_expression) { ...
  • 基本类型引用类型

    千次阅读 2016-03-25 13:04:33
    基本类型引用类型
  • 对象引用类型

    千次阅读 2013-07-18 11:56:29
    无论是通过计数算法判断对象的引用数量,还是通过根搜索算法判断对象引用链是否可达,判定对象是否存活都与“引用”相关。 引用主要分为 :强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak ...
  • C++函数返回引用

    万次阅读 多人点赞 2016-12-08 13:31:23
    函数返回值和返回引用是不同的 函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是...
  • 学习C++——返回类型

    千次阅读 2015-01-27 19:41:32
    1、无返回值函数 ...只要函数的返回类型不是void,函数中的return语句必须返回一个值,返回类型相同或可以隐式地转换。 值是如何被返回的 返回的值用于初始化调用点的一个临时量,该临时量是
  • * 静态类是程序在一开始运行的时候就为其分配了内存空间,而非静态类(引用类型)是在实例化之后才为其分配内存空间。 * 静态类方法不“属于”实例(对象),属于类。不能通过实例(对象)引用静态成员。静态类方法...
  • 函数的引用返回

    千次阅读 2012-08-03 11:27:17
    引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递。...但是,函数返回引用往往会带来一些意想不到的错误:比如返回临时变量的引用。  //一个错误的函数  int &Max(int i, int j)  {  return i
  • C++函数——返回类型

    千次阅读 2018-07-09 21:50:37
        无返回值函数: 没有返回值的return语句只能用在返回类型是void的函数中。     有返回值函数: return语句的第二种形式提供了函数的结果。 只要函数的返回类型不是void, 则该函数内的每条return语句...
  • JAVA基本数据类型引用数据类型

    万次阅读 多人点赞 2016-11-09 09:30:34
    基本数据类型 对象类型 在栈中进行分配 在堆中进行分配 基本类型之间的赋值是创建新的拷贝 对象之间的赋值只是传递引用 “==”和“!=”是在比较值 “==”和“!=”是在比较两个引用是否...
  • Java虽然有内存管理机制,但仍应该警惕内存泄露的问题。例如对象池、缓存中的过期对象都有...这几种引用级别由高到低分别为:强引用、软引用、弱引用和虚引用。 强引用:平时我们编程的时候例如:Object object=new
  • 引用类型和基本类型区别

    万次阅读 2011-12-20 22:34:35
    今天明白了一个困扰很久的问题:引用类型和基本类型的区别与联系 要明白这个问题,首先需要理解堆栈的概念。那什么又是堆栈,有什么区别和联系呢? 堆:首先堆是动态分配的,JVM并不会自动释放这部分内存。只用...
  • js基本类型 引用类型 简单赋值 对象引用,两个等号与三个等号的区别
  • Javascript中的基本类型引用类型

    千次阅读 2016-06-30 21:46:27
    一、基本类型引用类型概述 js中数据类型的值包括:基本类型值和引用类型值 基本数据类型:undefined;null;boolean;number;string 引用类型值:保存在内存中,js不允许直接访问内存位置,因此时操作引用而不是...
  • 为什么重载运算符要返回自身的引用

    千次阅读 多人点赞 2019-06-26 16:48:27
    本文topic 为什么重载运算符一定要返回自身...返回自身类型不行吗为什么一定要返回自身引用呢? 为了解释清楚这个问题,我们拿赋值运算符举例 首先定义一个简单的Number类 class Number { private: int num...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,084,767
精华内容 433,906
关键字:

引用返回类型