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

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

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. 接触到的一些数据结构: LIST_ENTRY, TAILQ

    双链表: LIST_ENTRY: typedef struct _LIST_ENTRY { struct _LIST_ENTRY  *Flink; follow: next entry, header ...

  2. WCF服务全局异常处理机制

    服务端增加WCF服务全局异常处理机制,任一WCF服务或接口方式出现异常,将统一调用WCF_ExceptionHandler.ProvideFault方法,因此不需要每个方法使用try catch写法. ...

  3. 【python】python获取当前日期前后N天或N月的日期

    # -*- coding: utf- -*- '''获取当前日期前后N天或N月的日期''' from time import strftime, localtime from datetime imp ...

  4. line-height用法总结

    Line-height是前端用语,经常被前端开发人员经常使用. line-height设置1.5和150%有什么区别?这是一个比较常见的前端面试题. 定义: line-height指的是文本行基线间的 ...

  5. 淡入淡出效果的js原生实现

    淡入淡出效果,在日常项目中经常用到,可惜原生JS没有类似的方法,而有时小的页面并不值得引入一个jQuery库,所以就自己写了一个,已封装, 有用得着的朋友, 可以直接使用. 代码中另附有一个设置元素透 ...

  6. 团队代码中Bug太多怎么办?怎样稳步提高团队的代码质量

    最近负责的Android APP项目,由于团队成员变动.界面改版导致代码大幅修改等原因,产品发布后屡屡出现BUG导致的程序崩溃. 经过对异常统计和代码走读,BUG主要集中在空指针引起的NullPoin ...

  7. React 获取 url 参数 —— this.props.match

    在 react 组件的  componentDidMount 方法中打印一下 this.props,在浏览器控制台中查看输出如下: 其中页面的 url 信息全都包含在 match 字段中,以地址 lo ...

  8. MUI -- plus初始化原理及plus is not defined,mui is not defined 错误汇总

    不要在没有plus和mui的环境下调用相关API 普通浏览器里没有plus环境,只有HBuilder真机运行和打包后才能运行plus api. 在普通浏览器里运行时plus api时控制台必然会输出p ...

  9. JavaWeb中session创建与销毁的问题

    今天遇到一个奇怪的问题,自己添加了一个session的监听,用来监听在线的人数.但打开浏览器时一直没有走进这个监听中来.最后百度找到了原因: 我们一直存在一个误区,javaweb中的session什么 ...

  10. 【BZOJ2648】SJY摆棋子 [KD-tree]

    SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己 ...