C++ 中类的构造函数理解(二)

写在前面

上次的笔记中简要的探索了一下C++中类的构造函数的一些特性,这篇笔记将做进一步的探索。主要是复制构造函数的使用。

复制构造函数

复制构造函数也称拷贝构造函数,它只有单个形参,且该形参是对本类类型对象的引用。其作用有以下几点:
1、根据另一个同类型的对象显示或隐式初始化一个对象
2、复制一个对象,将它作为实参传递给一个函数
3、从函数返回时复制一个对象
4、初始化顺序容器中的元素
5、根据元素初始化列表初始化数组元素

编译器合成的复制构造函数

如同默认构造函数一样,如果我们没有显示地定义复制构造函数,编译器将为我们合成一个复制构造函数。合成复制构造函数将新对象初始化为原对象的副本。编译器对每个数据成员进行注意初始化。合成复制构造函数直接复制内置类型成员的值,对于类类型的成员,则使用该类的复制构造函数进行复制。如果某个类包含数组类型的成员,那么合成复制构造函数将复制数组的每个元素。
测试代码如下:

#include<iostream>
#include<cstdio> using namespace std; class myClass{
public:
myClass(int i1, char c1)//普通构造函数
{
a = i1;
c = c1;
} int a;
char c;
}; int main()
{
myClass class1(1, 'a');
myClass class2( class1);//调用合成的复制构造函数 cout<<"class1 is: "<<class1.a<<" "<<class1.c<<endl;
cout<<"class2 is: "<<class2.a<<" "<<class2.c<<endl; system("pause");
return 0;
}

运行结果如下:

class1中的成员都被复制到了class2中。合成复制构造函数使用的是浅拷贝的策略。也就是说,如果class1中有指针类型的成员,那么使用合成的复制构造函数时,class2中对应的那个指针与class1中的指针指向的是同一片地址。

自定义的复制构造函数

自己定义复制构造函数时,可将复制构造函数的参数设置为类类型的引用,通常用const修饰参数。尽管也可以接受非const引用的复制构造函数。
测试代码如下:

#include<iostream>
#include<cstdio> using namespace std; class myClass{
public:
myClass(int i1, char c1)//普通构造函数
{
a = i1;
c = c1;
} myClass( const myClass& myclass)//复制构造函数
{ } int a;
char c;
}; int main()
{
myClass class1(1, 'a');
myClass class2( class1);//调用自定义的复制构造函数 cout<<"class1 is: "<<class1.a<<" "<<class1.c<<endl;
cout<<"class2 is: "<<class2.a<<" "<<class2.c<<endl; system("pause");
return 0;
}

上述代码自定义了拷贝构造函数,尽管自定义的复制构造函数函数体为空,但这时系统不再合成复制构造函数,而是调用用户自定义的,此时的运行结果如下:

由于自定义复制构造函数函数体为空,因此没有完成复制。
修改复制构造函如下:

    myClass( const myClass& myclass)
{
this->a = myclass.a;
this->c = myclass.c;
}

我们可以让自定义的复制构造函数在复制时采用深拷贝的方式。此外,当没有对当前的类重载运行符”=“时,下面这句话也是调用复制构造函数:

    myClass class3 = class1;

总结

这篇笔记写得有点匆忙,之后有时间需要进一步完善。

C++ 中类的构造函数理解(二)的更多相关文章

  1. C++中 类的构造函数理解(一)

    C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...

  2. 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...

    完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...

  3. 【C++学习之路】派生类的构造函数(二)

    二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( ...

  4. C++构造函数(二)

    本篇是介绍C++的构造函数的第二篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 复制构造函数 复制构造函数是构造函数的一种,也被称为拷贝构造函数,他只有一个参数,参数类型是本类的引用.默认构 ...

  5. 多线程系列之 java多线程的个人理解(二)

    前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ...

  6. C++一些新的特性的理解(二)

    1 C++11多线程thread 重点: join和detach的使用场景 thread构造函数参数 绑定c函数 绑定类函数 线程封装基础类 互斥锁mutex condition notify.wai ...

  7. SQL SERVER 2005/2008 中关于架构的理解(二)

    本文上接SQL SERVER 2005/2008 中关于架构的理解(一)      架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...

  8. 转载:C# this.invoke()作用 多线程操作UI 理解二

    Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); //测试的窗体 public class ...

  9. ThreadLocal深入理解二

    转载:http://doc00.com/doc/101101jf6 今天在看之前转载的博客:ThreadLocal的内部实现原理.突然有个疑问, 按照threadLocal的原理, 当把一个对象存入到 ...

随机推荐

  1. linux中U盘umonut时出现“Device is busy”的解决方法

    问题: #umount /dev/sda1 umount: /mnt/usb: device is busy 查找占用目录进程: #lsof |grep /mnt/usb bash 1971 root ...

  2. 修改linux默认jdk版本

    当你已经成功把jdk1.6.0_03 安装到 /usr/java,并且配置好了系统环境变量 执行 # java -version 时就是 显示jdk1.4.3,是因为你的linux系统有默认的jdk; ...

  3. nginx添加nginx_mod_h264_streaming-2.2.7模块编译报错

    报错ngx_http_streaming_module.c:158: 错误:‘ngx_http_request_t’ 没有名为 ‘zero_in_uri’ 的成员.这需要修改nginx_mod_h26 ...

  4. javascript 中文数字阿拉伯数字转换类 Nzh

    之前工作中碰到了数字转中文的情景,网上找的现成方法或多或少不合我的口味,最后还是自已写了一个. 现在整理了一下,补充了繁体,自定义字符,以及反函数(中文数字转阿拉伯数字) 现在发布出来,希望能合大家的 ...

  5. spring3定时器简单配置

    最近在做oa项目中写到一个功能,就是员工每天的签到和签退.当时想了很久都没有想出来,后来自己上网查了一下spring的定时器,然后就有了思路. 下面我贴上自己用到的这个定时器的配置.希望能够和大家一起 ...

  6. js和 jquery对象

    核心提示:jquery选择器得到的jquery对象和标准的 javascript中的document.getElementById()取得的dom对象是两种不同的对象类型,一般情况下,如S(’#id’ ...

  7. javascript高级编程运用

    一//各种尺寸 (size) s += “\r\n网页可见区域宽:“+ document.body.clientWidth; s += “\r\n网页可见区域高:“+ document.body.cl ...

  8. List排序的两种简便方式

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace List ...

  9. JAVA 日志管理

    http://www.360doc.com/content/10/0704/05/2017726_36768082.shtml http://javacrazyer.iteye.com/blog/11 ...

  10. web.xml中load-on-startup的作用(转)

    web.xml中load-on-startup的作用 如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker< ...