热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c++中六种构造函数的实现以及9中情况下,构造函数的调用过程

六种构造函数的实现代码如下:#include<iostream>usingnamespacestd;c++中六种默认的构造函数classTest{public:T

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

#include
using namespace std;
//c++中六种默认的构造函数
class Test
{
public:
Test(int d = 0):m_data(d)//1构造函数(带默认值0),以参数列表的形式初始化
{
cout<<"Creat Test Obj :"< }
~Test()//2析构函数
{
cout<<"Free Test Obj :"< }
Test(const Test &t)//3拷贝构造函数:以对象初始化对象
{
cout<<"Copy Test Obj :"< m_data = t.m_data;
}
Test& operator=(const Test &t)//4赋值语句
{
cout<<"Assgin:"< 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;
}

情况二:

//2
Test fun(Test t)
{
int value = t.GetData();
return Test(value);
}

int main()
{
Test t(10);
Test t1;
t1 = fun(t);
return 0;
}

情况三:

//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;
}

情况四:

//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);
}


情况七:

//7
Test fun(Test &t)
{
int value = t.GetData();
return Test(value);
}

void main()
{
Test t(10);
Test t1 = fun(t);
}

情况八:

//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);
}


综上所述:

一:调用拷贝构造函数的情况:

1)直接用对象初始化对象

2)形参数对象时,用实参对象初始化

3)函数的返回值类型是类时(非引用)是,拷贝构造无名的临时空间作为函数返回值

二:注意:

当函数的返回值是该函数中的一个临时对象时,函数类型不可以定义为Test &即引用,否则会发生,用一个已经析构的临时对象初始化另外一个对象,会发生错误;

三:提高效率的方式:

1)形参用引用,不再调用拷贝构造函数

2)返回一个无名的临时对象a,系统不再创建另外的一个临时对象而直接将a作为返回值,(函数返回类型不是引用)

3)返回无名的临时对象,且用它初始化另外一个对象,如情况七,直接将无名的对象作为另外的一个对象

4)上述三种情况结合;



推荐阅读
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C++ 类的 this 指针 语法练习5
    #include<iostream>#include<string>usingnamespacestd;定义一个类Studentclass ... [详细]
  • [置顶]        C++类的构造函数与析构函数的调用顺序
    1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 ... [详细]
  • 数据结构-图详解(图基本概念、图的存储结构及C++实现)
    本文主要介绍关于数据结构,c++,图论的知识点,对【数据结构-图详解(图基本概念、图的存储结构及C++实现)】和【数据结构图的存储结构代码】有兴趣的朋友可以看下由【NUC_Dodamce】投稿的技术文 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
author-avatar
柔柔的爱2502880187
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有