函数调用时,形参对象和返回对象均采用引用方式进行(临时对象作为中介),当一个对象作为参数(非引用)被函数调用时,该对象会通过复制构造函数获得一个临时对象,该临时对象以引用方式传递给函数,简言之,函数会被做以下处理:

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;
}

从上面的例子来看,赋值函数、复制构造函数与构造函数地位同等重要。

最新文章

  1. Azure 部署 Asp.NET Core Web App
  2. 移动端的拖拽这个demo实现的功能
  3. js事件之event.preventDefault()与event.stopPropagation()用法区别
  4. 【个人使用.Net类库】前言
  5. MYSQL数据库重点:事务与锁机制
  6. 删除Ngnix 日志
  7. 通过html5的range属性动态改变图片的大小
  8. 1410 - Consistent Verdicts(规律)
  9. 在React中使用CSS Modules设置样式
  10. Java基础学习(二)—数组
  11. Guitar Pro中如何添加与删除音轨
  12. WWDC 17: 开发者的最初观感
  13. JaveWeb 公司项目(2)----- 类模态窗口显示DIV并将DIV放置在屏幕正中间
  14. 树状数组(hdu-4325,hdu-1166,pat-1057)
  15. Bitcoin区块验证
  16. 【树莓派】树莓派与XBMC及Kodi、LibreELEC插件(一)
  17. opencv3寻找最小包围矩形在图像中的应用-滚动条
  18. Laravel 跨框架队列交互
  19. 【探路者】Beta发布用户使用报告
  20. .net core 2.2 &amp; Mongodb

热门文章

  1. iphone 3gs 美版,6.1.3+降基带+越狱+解锁。成功分享(转)
  2. jquery总结04-DOM节点操作
  3. switch多分支语句简析
  4. MFC编程入门之十(对话框:设置对话框控件的Tab顺序)
  5. PHP 小方法之 显示 今天 昨天 上周 上月 近三月 的时间
  6. D3.js 更自由的条形图
  7. nodejs的第一天学习笔记
  8. oracle 语句 字段拼接(可换行)
  9. 关于如何写UI及屏幕适配的一些技巧
  10. JS判断form内所有表单是否为空