C++ 中的形参与返回值
2024-10-17 11:19:55
函数调用时,形参对象和返回对象均采用引用方式进行(临时对象作为中介),当一个对象作为参数(非引用)被函数调用时,该对象会通过复制构造函数获得一个临时对象,该临时对象以引用方式传递给函数,简言之,函数会被做以下处理:
void foo(A x);
A a
foo( a);
处理后:
void foo(A& x);
A a
A x(a);
foo(x);
而返回值则根据不同的函数调用方式来进行不同程度的优化,如下面的调用方式,会直接将对象b作为引用传递给函数bar:
A bar();
A b = bar();
//处理后
bar(A& a);
A b;
bar(b);
如先定义一个对象,编译器就不会对此种情况优化。
A a;
a = bar();//bar函数先产生一个临时对象,再调用赋值构造函数
完整测试代码如下:
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring> using namespace std; class A {
public:
A()
{
str = (char *)calloc(sizeof(char),10);
memcpy(str,"hello",5);
cout << "A()" << endl;
} ~A()
{
//delete str;
cout << "~A()" << endl;
} A(const A& a)
{
cout << "A(const A &a)" << endl;
} A& operator=(const A &a) {
cout << "A operator=(const A&a)" << endl;
} private:
char *str;
int len;
}; void foo(A a)
{
cout << "void foo(A)" << endl;
} A bar()
{
A a;
cout << "A bar()" << endl;
return a;
} int main(int argc, char *argv[])
{
A a; // A x(a)
// foo(&x);
//foo(a); //A b = bar(); a = bar(); return 0;
}
从上面的例子来看,赋值函数、复制构造函数与构造函数地位同等重要。
最新文章
- Azure 部署 Asp.NET Core Web App
- 移动端的拖拽这个demo实现的功能
- js事件之event.preventDefault()与event.stopPropagation()用法区别
- 【个人使用.Net类库】前言
- MYSQL数据库重点:事务与锁机制
- 删除Ngnix 日志
- 通过html5的range属性动态改变图片的大小
- 1410 - Consistent Verdicts(规律)
- 在React中使用CSS Modules设置样式
- Java基础学习(二)—数组
- Guitar Pro中如何添加与删除音轨
- WWDC 17: 开发者的最初观感
- JaveWeb 公司项目(2)----- 类模态窗口显示DIV并将DIV放置在屏幕正中间
- 树状数组(hdu-4325,hdu-1166,pat-1057)
- Bitcoin区块验证
- 【树莓派】树莓派与XBMC及Kodi、LibreELEC插件(一)
- opencv3寻找最小包围矩形在图像中的应用-滚动条
- Laravel 跨框架队列交互
- 【探路者】Beta发布用户使用报告
- .net core 2.2 &; Mongodb