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++