参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题)

用到复制构造函数的情况:

1.函数值传递

2.返回对象

3.用一个对象初始化另一个对象

重点注意下面两种情况:

① 只调用复制构造函数,不会生成临时变量

  A a = b;

② 会产生临时变量,会调用复制构造函数和赋值函数

  A a;

  a = A(b);

#include<iostream>
using namespace std; class hyong
{
public:
int a, b, c;
hyong()
{
a = b = c = ;
cout << "construct" <<endl;
}
hyong(int i)
{
a = b = c = i;
cout << "construct 2" <<endl;
}
hyong(const hyong &obj) //复制构造函数
{
a = b = c = ;
cout << "construct copy" <<endl;
}
void h(hyong k) //值传递
{
cout << "k.a = " << k.a << " k.b = " << k.b<< endl;
}
hyong & hyong::operator = (const hyong & other)
{
cout << "=" << endl;
if(this == &other)
return *this;
a = other.a;
b = other.b;
c = other.c;
return *this;
} ~hyong()
{
cout << "xigou" << endl;
}
}; hyong f() //返回对象
{
hyong m3();
return m3;
} int main()
{
hyong m();
hyong n = m; //调用复制构造函数
cout << m.a << m.b << endl;
cout << n.a << n.b << endl;
hyong m1 = hyong(m); //调用复制构造函数
cout << m1.a << m1.b << endl;
hyong m2(m); //调用复制构造函数
cout << m2.a << m2.b << endl;
hyong *p = new hyong(m); //调用复制构造函数
cout << p->a << p->b << endl;
cout << "------------"<< endl;
hyong m3;
m3 = hyong(m); //先用复制构造函数得到了一个临时变量,然后用赋值函数将临时变量值赋给m3, 之后临时变量析构
cout << "------------"<< endl;
hyong m4;
m4 = m; //直接调用赋值
cout << "------------"<< endl;
hyong m5 = f(); // 设f()返回的临时变量为r,其实r就是函数里的m3,
//m3通过复制构造函数赋给m5,之后m3析构
cout << "------------"<< endl;
hyong m6; //先定义,并用默认构造函数初始化了m6
m6 = f(); //f()返回m3, 然后用复制构造函数将m3赋给了临时变量tmp, m3析构;
//tmp通过赋值函数赋给m6, tmp析构
cout << "------------"<< endl;
hyong m7(f()); // 设f()返回m3,m3通过复制构造函数赋给m7,之后m3析构
return ;
}

【C++】复制构造函数的更多相关文章

  1. 剑指offer:赋值运算符函数和复制构造函数

    赋值运算符函数 对于定义一个赋值运算符函数时,需要注意一下几点: (1)函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值 (2)传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函 ...

  2. 剑指offer 复制构造函数

    复制构造函数: A(const A &other){value=other.value;} 也就是传值参数改为常量引用. #include<iostream> using name ...

  3. 编译器角度看C++复制构造函数

    [C++对象模型]复制构造函数的建构操作 关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义.调用时机.也对编译器合成的复制构造函数行为 ...

  4. C++ 复制控制之复制构造函数

    7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应. 不是没有声明复制控制函数时 ...

  5. C++ 复制构造函数

    C++类的设计中,如果某些函数没有显式定义,C++会自动生成,复制构造函数便是其中之一,其他的还有默认构造函数.赋值操作符.默认析构函数.地址操作符.一个类的复制构造函数的原型一般为: Class_n ...

  6. 我的c++学习(7)引用和复制构造函数

    一.引用 什么是引用? 引用又称别名(alias),是一种非常特殊的数据类型.它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是 C++系统不为引用类型变量分配内存空间.引用主要用 ...

  7. C++中的复制构造函数

    与C++中的构造函数相同,复制构造函数在对象生成过程中同样进行插入对应的Vtable虚表,但在成员变量赋值时,除具有复制构造函数的成员对象外,编译器合成复制构造函数其余均采用”Bitwise copy ...

  8. C++学习基础六——复制构造函数和赋值操作符

    1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作 ...

  9. C++中复制构造函数

    复制构造函数 复制构造函数用于: 根据另一个同类型的对象显示或隐式初始化一个对象 复制一个对象,将它作为实参传给一个函数 从函数返回时复制一个对象 初始化顺序容器中的元素 根据元素初始化式列表初始化数 ...

  10. 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)

    注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...

随机推荐

  1. BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)

    Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道 ...

  2. 最短路径——Dijkstra算法

    一.相关定义 最短路径:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径. 地位:Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据 ...

  3. Daily Scrum02 11.30

    纵然编译大作业压顶,大家还是顶住压力,保证了软工项目的持续进行. Member Today's Task Tomorrow's Task 李孟 Task856 熟悉单元测试方法熟悉单元测试方法 Tas ...

  4. linux基本操作1

    ctrl + alt + T 打开命令行 -根目录下home中为用户建的文件夹 cd 加目录名称转到当前目录 .当前目录..上级目录 ls 当前目录下的文件ls -l 显示当前目录下文件的权限 mkd ...

  5. lintcode-130-堆化

    130-堆化 给出一个整数数组,堆化操作就是把它变成一个最小堆数组. 对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[ ...

  6. require.js 模块化

    什么是模块化? 将若干功能进行封装,以备将来被重复使用. 为什么要前端模块化? 将公共功能进行封装实现复用 灵活解决依赖 解决全局变量污染 如何实现前端模块化? <!DOCTYPE html&g ...

  7. DataBase -- FUNCTION

    SQL拥有很多课用于计数和计算的内建函数. SELECT function(列) FROM 表 合计函数(Aggregate Functions) Aggregate函数的操作面向一系列的值,并返回一 ...

  8. vue.js 三种方式安装--npm安装

    Vue.js是一个构建数据驱动的 web 界面的渐进式框架.     Vue.js 的目标是通过简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易上手,便于与第三方库或既有项目整合.     ...

  9. (转)tableview的索引设置

    .感觉tableview的索引条将表视图往左边挤了一点?别担心,只是颜色问题.只要如此设置即可 //索引条背景的颜色(清空颜色就不会感觉索引条将tableview往左边挤) [_tableView s ...

  10. 51nod1031(简单斐波拉契数列)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1031 题意:中文题诶- 思路:对于第x块骨牌的情况,我们用a ...