c++中六种构造函数的实现以及9中情况下,构造函数的调用过程
六种构造函数的实现代码例如以下:
#include<iostream>
using namespace std;
//c++中六种默认的构造函数
class Test
{
public:
Test(int d = 0):m_data(d)//1构造函数(带默认值0),以參数列表的形式初始化
{
cout<<"Creat Test Obj :"<<this<<endl;
}
~Test()//2析构函数
{
cout<<"Free Test Obj :"<<this<<endl;
}
Test(const Test &t)//3拷贝构造函数:以对象初始化对象
{
cout<<"Copy Test Obj :"<<this<<endl;
m_data = t.m_data;
}
Test& operator=(const Test &t)//4赋值语句
{
cout<<"Assgin:"<<this<<":"<<&t<<endl;
if(this != &t)
{
m_data = t.m_data;
}
return *this;
}
Test* operator&()//5对象取址
{
return this;
}
const Test* operator&()const//6常对象取址
{
return this;
}
int GetData()
{
return m_data;
}
private:
int m_data;
};
以下介绍9种情况下构造函数的调用过程:
情况一:
//1
Test fun(Test t)
{
int value = t.GetData();
Test tmp(value);
return tmp;
} int main()
{
Test t(10);
Test t1;
t1 = fun(t);
return 0;
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWm9uZ1lpbkh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
情况二:
//2
Test fun(Test t)
{
int value = t.GetData();
return Test(value);
} int main()
{
Test t(10);
Test t1;
t1 = fun(t);
return 0;
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWm9uZ1lpbkh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
情况三:
//3
Test fun(Test &t)
{
int value = t.GetData();
Test tmp(value);
return tmp;
} int main()
{
Test t(10);
Test t1;
t1 = fun(t);
return 0;
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWm9uZ1lpbkh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
情况四:
//4
Test fun(Test &t)
{
int value = t.GetData();
return Test(value);
} void main()
{
Test t(10);
Test t1;
t1 = fun(t);
}
情况五:
//5
Test& fun(Test &t)
{
int value = t.GetData();
Test tmp(value);
return tmp;
} void main()
{
Test t(10);
Test t1;
t1 = fun(t);
}
情况六:
//6
Test& fun(Test &t)
{
int value = t.GetData();
return Test(value);
} void main()
{
Test t(10);
Test t1;
t1 = fun(t);
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWm9uZ1lpbkh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
情况七:
//7
Test fun(Test &t)
{
int value = t.GetData();
return Test(value);
} void main()
{
Test t(10);
Test t1 = fun(t);
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWm9uZ1lpbkh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
情况八:
//8
Test fun(Test &t)
{
int value = t.GetData();
Test tmp(value);
return tmp;
} void main()
{
Test t(10);
Test t1 = fun(t);
}
情况九:
Test& fun(Test &t)
{
int value = t.GetData();
Test tmp(value);
return tmp;
} void main()
{
Test t(10);
Test t1;
t1 = fun(t);
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWm9uZ1lpbkh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
综上所述:
一:调用拷贝构造函数的情况:
1)直接用对象初始化对象
2)形參数对象时,用实參对象初始化
3)函数的返回值类型是类时(非引用)是,拷贝构造无名的暂时空间作为函数返回值
二:注意:
当函数的返回值是该函数中的一个暂时对象时,函数类型不能够定义为Test &即引用,否则会发生,用一个已经析构的暂时对象初始化另外一个对象,会错误发生;
三:提高效率的方式:
1)形參用引用,不再调用拷贝构造函数
2)返回一个无名的暂时对象a。系统不再创建另外的一个暂时对象而直接将a作为返回值。(函数返回类型不是引用)
3)返回无名的暂时对象,且用它初始化另外一个对象,如情况七。直接将无名的对象作为另外的一个对象
4)上述三种情况结合;
c++中六种构造函数的实现以及9中情况下,构造函数的调用过程的更多相关文章
- IE 中单元格的 colspan 属性在某些情况下会影响 TABLE 元素的自动布局
今天在写一个jsp页面时,遇到一个如下的问题:在一个table中写了如下内容,table中定义了4列,在firefox中能正常显示,而在ie8中,显示不正常, 如下如图1:第二,三,四列宽度发生变化, ...
- SQL Server 在数据库中查找字符串(不知道表名的情况下 查找字符串)
declare @key varchar(30)set @key = '广州' --替换为要查找的字符串DECLARE @tabName VARCHAR(40),@colName VARCHAR(40 ...
- .Java中的异常、断言、日志【草稿下,Log4j专题】
(本章主要讲解Java里面比较核心的一块内容--异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时 ...
- 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法
在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法 ==========方法1: --------1. 选相应 ...
- CorelDRAW中六种复制对象的方法详解
复制可保证对象的大小一致,复制也是所有操作中最基本的操作.CorelDRAW软件中支持多种复制对象的操作,本教程将详解CorelDRAW中六种复制对象的方法. 方法一 选择复制对象,点击编辑→复制,再 ...
- java中静态代码块,非静态代码块,构造函数
关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...
- C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?
摘要 我们都知道,C#中,在类型继承时,由于构造子类必须先构造其父类型的内容,因此,必须子类型的构造函数中调用父类型的构造函数(无参数的不需要显式声明). 但是往往我们会出现,子类型本身的构造函数大于 ...
- Oracle中的内置函数在sql中的转换整理
程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...
- WPF 在事件中绑定命令(不可以在模版中绑定命令)
其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...
随机推荐
- The evolution of cluster scheduler architectures--转
原文地址:http://www.firmament.io/blog/scheduler-architectures.html cluster schedulers are an important c ...
- PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(5)
2.5 XLOG的内部结构 我们将使用事务贯穿本书,并让您在技术层面上更深地洞察事情是如果工作的,我们已经增加了这部分专门处理XLOG的内部工作机制.我们会尽量避免前往下降到C级,因为这将超出本书的范 ...
- UI Framework-1: Aura
Aura (obsolete) This document is still good for a high level overview, with contact information, but ...
- UI Framework-1: views
views Overview and background Windows provides very primitive tools for building user interfaces. Th ...
- 关于ios11和Chrome浏览器非HTTPS 对高德定位不支持问题
最近,在开发二维码签到系统时,需要对用户的签到的经纬度进行获取,并且判断签到距离是否在可支持范围内. 使用了高德地图.因为本人最近刚刚入手了一款新的Iphone7里面是最新的ios11系统.发现我的手 ...
- luogu P3157 [CQOI2011]动态逆序对(CDQ分治)
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
- 去除windows编辑文本中的回车符
情景描述: 最近,huskiesir的朋友遇到了一个很奇葩的问题.那就是他在windows上搭建了一个http服务,把A脚本放在了上面并用linux去下载和执行,但是在执行的时候出现了问题,在linu ...
- P1872 回文串计数(回文树)
题目描述 小a虽然是一名理科生,但他常常称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名其妙的热爱,这也促使他走向了以记忆量大而闻名的生物竞赛.然而,他很快发现这并不能满足他热爱背诵的心,但 ...
- 百度地图SDK for Android【Demo兴趣点搜索】
百度地图SDK为开发人员提供了便捷的检索服务. 今天我将为大家介绍Poi检索相关的内容. 首先,我们要构建一个最主要的地图应用.详细介绍请參考:百度地图SDK for Android[ ...
- 转:Mac下搭建svn服务器和XCode配置svn
Mac下搭建svn服务器和XCode配置svn 先打开命令行终端. 1.创建svn repository svnadmin create /yourpath/svnroot/repository 2. ...