六种构造函数的实现代码例如以下:

#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中情况下,构造函数的调用过程的更多相关文章

  1. IE 中单元格的 colspan 属性在某些情况下会影响 TABLE 元素的自动布局

    今天在写一个jsp页面时,遇到一个如下的问题:在一个table中写了如下内容,table中定义了4列,在firefox中能正常显示,而在ie8中,显示不正常, 如下如图1:第二,三,四列宽度发生变化, ...

  2. SQL Server 在数据库中查找字符串(不知道表名的情况下 查找字符串)

    declare @key varchar(30)set @key = '广州' --替换为要查找的字符串DECLARE @tabName VARCHAR(40),@colName VARCHAR(40 ...

  3. .Java中的异常、断言、日志【草稿下,Log4j专题】

    (本章主要讲解Java里面比较核心的一块内容--异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时 ...

  4. 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

    在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法   ==========方法1: --------1. 选相应 ...

  5. CorelDRAW中六种复制对象的方法详解

    复制可保证对象的大小一致,复制也是所有操作中最基本的操作.CorelDRAW软件中支持多种复制对象的操作,本教程将详解CorelDRAW中六种复制对象的方法. 方法一 选择复制对象,点击编辑→复制,再 ...

  6. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

  7. C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?

    摘要 我们都知道,C#中,在类型继承时,由于构造子类必须先构造其父类型的内容,因此,必须子类型的构造函数中调用父类型的构造函数(无参数的不需要显式声明). 但是往往我们会出现,子类型本身的构造函数大于 ...

  8. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  9. WPF 在事件中绑定命令(不可以在模版中绑定命令)

    其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...

随机推荐

  1. less02-变量

    html <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  2. js中如何获取对象的长度和名称

    js如何获取对象长度和名称 一.总结 一句话总结:对象的长度不能用.length获取,用js原生的Object.keys可以获取到 var obj = {'name' : 'Tom' , 'sex' ...

  3. 面向对象(OOP)五大基本原则

    书单 <Object-Oriented Analysis & Design with Application>:Grady Booch, 下载地址:object-oriented- ...

  4. Ubuntu14.04下tensorflow安装

    自己电脑没装双系统,于是决定在虚拟机里装个tensorflow,以下是安装过程: 1.安装anaconda2 for Linux 官网下的话很慢,去清华的镜像网站下吧,我上一篇文章有网址 安装:bas ...

  5. CentOS7-1810 系统Samba配置说明

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件.SMB(Server Messages Block,信息服务块)通信协议是微软(Microsoft)和英特尔(Intel)在198 ...

  6. nginx直接连接操作memcache

    原理:     Nginx 要设定一个 key 去查 mem ,如果没查到,要有一个回调 php ,并且 key 传给 php.     配置方式:     server{               ...

  7. PHP7内核剖析之执行流程

    以fpm为例: 1.fpm启动时,会先执行 module_startup, 并随着fpm进程常驻 2.当一个请求到达之后,会执行 request_startup, 进行一些请求初始化工作,然后执行代码 ...

  8. bzoj1090 字符串折叠

    问题描述 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S  S 2. X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S)  SSSS…S(X个S). 3. 如果A ...

  9. NOIP 2017 小凯的疑惑(同余类)

    题意 给出两个互质的数a,b问最大的不能被xa+yb(x,y>=0)表示的数.(a,b<=109) 题解 NOIPday1T1一道数论题,不知埋葬了多少人的梦想. 用同余类去解释. 我们依 ...

  10. 题解 P3374 【【模板】树状数组 1】

    恩,这是AC的第一道树状数组呢. 本蒟蒻以前遇到RMQ问题一般都用线段树或ST表,可惜ST表不支持在线修改,而线段树代码量又太大. 如今终于找到了折中方案:树状数组!!!!代码量小,还支持修改! 树状 ...