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

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

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. 学习bash——通配符与特殊符号

    一.通配符 这是bash操作环境中一个非常有用的功能,这让我们使用bash处理数据就更方便了. 常用通配符如下: 符号 意义 * 代表0个到无穷多个任意字符 ? 代表一个任意字符 [] 代表一定有一个 ...

  2. 【转】 The user specified as a definer ('root'@'') does not exist when using LOCK TALBE

    在linux下,用mysql的导出语句: mysqldump -u root -pPasswd table >/home/lsf/test.sql 出现了 Got error: 1449: Th ...

  3. MySQL初识3

    随着对MySQL的熟识,今次总结一下MySQL数据库的删除.备份和还原操作 1.数据库的删除: a.删除数据库的命令:drop database dbname; b.删除数据库中的表: 单个表:dro ...

  4. lintcode-45-最大子数组差

    45-最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 注意事项 子数组最少包含一个数 样例 给出 ...

  5. iOS-plist文件的写读

    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"xiaoli" ofType:@"plist ...

  6. Java面试题(下)

    这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题, ...

  7. [LOJ #2538][PKUWC 2018]Slay the Spire

    题目大意:一开始有 $2n$ 张牌,每张牌上都写着一个数字 $w_i$,有两种的牌,每种类型各 $n$ 张: 1.攻击牌:打出后对对方造成牌上的数字的伤害. 2.强化牌:打出后,设数字为 $x$,则其 ...

  8. 移动开发:美团外卖Android Lint代码检查实践

    概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量.除了Android原生提供的几百个Lint规则,还可以开发自定义L ...

  9. [Leetcode] set matrix zeroes 矩阵置零

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click ...

  10. C&C++——extern

    1.C 调用C++的函数或变量 C 调用C++的函数或变量,在C++的头文件声明为extern "C" ,C调用的时候只使用extern 声明. 可见,extern "C ...