当前位置:编程学习 > C/C++ >>

c++中的return 问题

#include <iostream>
using namespace std ;
class A
{
 public:
  A(int i ){ cout<<"执行构造函数创建一个对象\n" ;  x = i ; }
     A( A&a){  x = a.x ; cout<<"执行复制构造函数创建一个对象\n" ;  }
  ~A(){ cout<<"执行析构函数!\n" ; }
  int get( ) { return x ; }
    private:
  int x ;
};
A &func( ) //按别名返回
{
  cout<<"跳转到func函数中\n" ;
  A *p = new A(99) ;
  cout<<"堆中对象的地址:"<<p<<endl ;
  return *p ;  ///////////这句return *p 有什么用
 }

int main( )
{
A &r = func( ) ;

cout<<"堆中对象的副本的地址:"<<&r<<endl ;
cout<<r.get( )<<endl ;
A *p = &r ;
delete p ;
cout<<r.get()<<endl ;
system("pause") ;
return 0 ;
}


 

答案:直接看main函数的这段代码:A &r = func( ) ; 就可以了;
声明一个A类,名为r,那么,这个r的值是什么?
是func( )函数的值;
这个func( )函数的值怎么来的?
在获取它的值的时候,会进入这个func()函数,并执行里面的语句,当碰到return时,就将return右边的变量作为这个函数的值,之后退出func()函数;退出func()函数函数后, func()函数的返回值就会赋给 r 。


如果你想得到另一个函数处理后的某个变量的值,就可以在那个函数里写上形如” return  变量名; “的语句,这个函数在执行这条语句时将这个变量的值返回,并且退出函数;想得到这个函数的值,在调用这个函数前,先声明一个同类型的变量,然后和赋值语句一样,等号左边写上刚刚声明的变量名,等号右边写上函数名(参数1,参数2....);,没有参数就留个空括号,具体类似于这样:
int func()
{
    int n = 100;
     return n;
}
int main()
{
  int i;
  i = func();
  printf("%d\n", i);
  return 0;
}
这个简单的程序就会在屏幕上打印100.


A &func( ) //按别名返回
{
  cout<<"跳转到func函数中\n" ;
  A *p = new A(99) ; 
  cout<<"堆中对象的地址:"<<p<<endl ;
  return *p ;  ///////////这句return *p 有什么用
 }
新声明一个a类的指针p,声明时会有构造函数对值进行初始化,之后,返回指针p给上一级函数;main函数中的A &r = func( ) ;就是得到函数返回的指针p,用同类型的r来引用func()函数中已赋了初始值的p。

#include <iostream>
using namespace std ;
class A
{
public:
A(int i ){ cout<<"执行构造函数创建一个对象\n" ;  x = i ; }
A( A&a){  x = a.x ; cout<<"执行复制构造函数创建一个对象\n" ;  }
  ~A(){ cout<<"执行析构函数!\n" ; }
  int get( ) { return x ; } 
private:
int x ;
};


A& func( ) //按别名返回
{
  cout<<"跳转到func函数中\n" ;
  A *p = new A(99) ; 
  cout<<"堆中对象的地址:"<<p<<endl ;
  return *p ;  ///////////这句return *p 有什么用
  //返回你申请的对象。
 }
int main( )
{
A &r = func( ) ;
cout<<"堆中对象的副本的地址:"<<&r<<endl ;
cout<<r.get( )<<endl ;
A *p = &r ;
delete p ;//你这有问题,没有申请空间,不要delete; 
cout<<r.get()<<endl ; 
system("pause") ; 
return 0 ;
}每个函数都有一个隐藏的约定好全局变量 eax (可以通过在C++里面嵌入汇编访问),
1) return *p;     即 eax = *p;
2) A &r = func(); 即 func(); A &r = eax;
合并1)  2)中的 等式, 即得到 A &r = *p;
至于 为什么要 & 和 *, 不要会有什么问题,这就不是return 所管辖的了

您好,为了避免问题被您遗忘而导致过期,如果您没有其它问题需要咨询回答者,请及时通过采纳回答者的答案来解决此问题,尊重回答者的劳动成果,谢谢!

上一个:学好C++有什么用?
下一个:怎样才能系统的学好c++

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,