【C++】复制构造函数
参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题)
用到复制构造函数的情况:
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++】复制构造函数的更多相关文章
- 剑指offer:赋值运算符函数和复制构造函数
赋值运算符函数 对于定义一个赋值运算符函数时,需要注意一下几点: (1)函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值 (2)传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函 ...
- 剑指offer 复制构造函数
复制构造函数: A(const A &other){value=other.value;} 也就是传值参数改为常量引用. #include<iostream> using name ...
- 编译器角度看C++复制构造函数
[C++对象模型]复制构造函数的建构操作 关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义.调用时机.也对编译器合成的复制构造函数行为 ...
- C++ 复制控制之复制构造函数
7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应. 不是没有声明复制控制函数时 ...
- C++ 复制构造函数
C++类的设计中,如果某些函数没有显式定义,C++会自动生成,复制构造函数便是其中之一,其他的还有默认构造函数.赋值操作符.默认析构函数.地址操作符.一个类的复制构造函数的原型一般为: Class_n ...
- 我的c++学习(7)引用和复制构造函数
一.引用 什么是引用? 引用又称别名(alias),是一种非常特殊的数据类型.它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是 C++系统不为引用类型变量分配内存空间.引用主要用 ...
- C++中的复制构造函数
与C++中的构造函数相同,复制构造函数在对象生成过程中同样进行插入对应的Vtable虚表,但在成员变量赋值时,除具有复制构造函数的成员对象外,编译器合成复制构造函数其余均采用”Bitwise copy ...
- C++学习基础六——复制构造函数和赋值操作符
1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作 ...
- C++中复制构造函数
复制构造函数 复制构造函数用于: 根据另一个同类型的对象显示或隐式初始化一个对象 复制一个对象,将它作为实参传给一个函数 从函数返回时复制一个对象 初始化顺序容器中的元素 根据元素初始化式列表初始化数 ...
- 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)
注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...
随机推荐
- Pro Git - 笔记1
Getting Started About Version Control Local Version Control Systems Centralized Version Control Syst ...
- python中通过string类名获得实例
原文:https://bytes.com/topic/python/answers/42866-how-create-object-instance-string Ksenia Marasanova的 ...
- Mybatis学习系列(七)缓存机制
Mybatis缓存介绍 MyBatis提供一级缓存和二级缓存机制. 一级缓存是Sqlsession级别的缓存,Sqlsession类的实例对象中有一个hashmap用于缓存数据.不同的Sqlsessi ...
- JVM(2)——GC算法和收集器
一.引入 上篇博客<JVM--简介>中主要介绍了JVM的内存模型,思考一下: 为什么要划分堆.栈.方法区等? 为什么把不同种类的数据信息分别存放? 答案可以分为很多很多条,这里就说一个方面 ...
- 2017博普杯 东北大学邀请赛(B. Drink too much water)(贪心+树链剖分)
题目地址:https://oj.neu.edu.cn/problem/1204 题目大意: 其实就是树上的线段覆盖, 给出一棵n个结点的树,然后给出树上的一些路径进行覆盖,然后要求选取最少的点,能够把 ...
- [Leetcode] Best time to buy and sell stock ii 买卖股票的最佳时机
Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...
- 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索
第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...
- JQuery拖拽改变元素的尺寸
"元素拖拽改变大小"其实和"元素拖拽"一个原理,只是所动态改变的对象不同而已,主要在于 top.left.width.height 的运用,相对实现起来也非常容 ...
- Asp.net MVC Combres的简单用法
第一步:添加nuget包 [1]添加 nuget包后,会自动在 webconfig里面 添加配置文件(不用改) <section name="dotless" type=&q ...
- Elasticsearch 5.2.1Cluster 搭建
1.安装java cd ~ wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fw ...