技术标签: C++ 赋值构造函数 构造函数 C++重要的基本概念 拷贝构造函数
为了让用户自定义类型能够像基本内置类型一样,能够被被方便地进行初始化,方便地进行声明、拷贝和赋值,C++定义了构造函数的概念。构造函数的任务是初始化类对象的数据成员,一旦类的对象被创建,构造函数就会自动被调用。
前面我们了解到构造函数的定义和作用,下面我们就接着讨论构造函数的一般特点,总结起来主要有五个:
按照构造函数的用途不同,可以对构造函数进行划分,包括默认构造函数,一般普通构造函数,拷贝构造函数,移动构造函数,转换构造函数和他们各自的合成版本。下面主要讨论这几种构造函数的特点,以及他们对应的编译器的合成版本。
类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数,默认构造函数是不需要任何实参的。例如,
class A{
private:
int a;
public:
A(){a=0;}//,默认构造函数,参数列表为空
};
在类没有声明任何构造函数的时候,编译器会合成默认构造函数。但是我们应该尽量不要依靠编译器的这种特性,原因有三个:编译器只有在没有任何构造函数的时候才会合成;其次,合成的默认构造函数可能会进行一些未定义的行为,这就给程序的执行带来类隐患;如果类中的某个成员是一个没有定义默认构造函数的类的对象,那么编译器就不能为该类合成默认构造函数。
如果一个构造函数的第一个参数是类自身的引用,且除此之外的参数都是默认值,那么这样的函数称为拷贝构造函数。例如,
class Foo{
Foo();//默认构造函数
Foo(const Foo&);//拷贝构造函数
//others
};
如果我们没有定义构造函数,编译器会为我们合成一个构造函数,但是编译器的合成版本只是简单地将类的成员逐个的拷贝到正在创建的对象中,如果类的成员是内置类型则简单拷贝,如果类的成员是类类型则调用相应类的拷贝构造函数。
拷贝构造函数的作用主要是进行拷贝初始化,那么在什么情况下拷贝构造函数会被调用呢?
举个例子,我们观察下面的这段代码有几处调用了拷贝构造函数。注意,之列出代码的关键部分,省略了不必要的细节。
Point global;
Point foo_bar(Point arg){ //调用函数时,会调用一次拷贝构造函数
Point local=arg, //=,调用
*heap=new Point(global);//类似于函数调用,需要调用一次
*heap=local; //=,调用
Point pa[4]={local,*heap};//数组初始化,调用一次
return *heap; //返回是类的对象,调用
}
转换构造函数实际上是C++中的一种默认类型转换的机制,这种构造函数只定义了一个形参,可以发生从形参类型到类类型的转换,值得注意的是这种转换只允许进行一步。我们还是通过一个例子来理解,
class Sales_data{
public:
Sales_data()=default;
Sales_data(const string &s);//转换构造函数
Sales_data combine(const Sales_data&);
//类中其他成员
...
};
string book="C++";
Sales_data item;
item.combine(book);//正确,string转换为Sales_data
item.combine("C++");//错误,cosnt char*发生一步转换为string
最后,补充一点,转换构造函数并不是百里而无一害的,在必要的时候我们还需要通过explict关键字来抑制这种隐式转换。尽管使用explicit关键字之后,编译器不会进行相关的隐式转换了,但是我们可以使用static_cast关键字进行强制类型转换。
注意,本文不是为了介绍语法细节,而更多是为了让你建立起对构造函数完整的认识。因此,想要想要了解更多关于构造函数的知识,建议阅读相关的语法书籍。
=== 数组的维数与矩阵的维数需要区分开===(转载)1. 概述在机器学习过程中,我们会经常遇到向量、数组和矩阵这三种数据结构,下面就这三种数据结构做一次详细的分析。同时我们时常困惑于维度,n维向量,n维数组,矩阵的维度,本文着重就这一方面进行分析。2. 向量、数组和矩阵2.1 向量在解析几何中,我们把“既有大小又有方向的量”叫做向量,并把可随意平行移动的有向线段作为向量的几何形象。...
融合树允许通过按不同程度组合不同动画的各个部分来平滑混合多个动画可以方便的实现从一个动作过渡到另一个动作,会让动画播更加流畅如一个人物 跑动、左转、右转等动画构建融合树后让人物的移动更加的逼真1D和2D融合1d融合需要1个参数,2d需要两个参数 2d融合时 这里我来融合了我的rpg游戏中法师人物的所有技能动画。通过改变skill_number参数来控制人物释...
这是我漫长竞赛生涯的故事,这些故事是我最幸福最真实的记忆,写下这些文字时也是我最热忱,最感恩的时刻。退役后和 OI 的藕断丝连让我发现,做题与比赛是我最真实的时刻,没有外面的纷争或者内心的矛盾,只有大脑的思维在碰撞,它们把我带到了另一个世界,这里很安静,纯洁,简单而又精致。当我意识到这点时,已经没有剩下的比赛让我享受了,我和 OI 的关系也仅仅是藕断丝连,在出题,讲题和盼望着比赛中与它漫长地告别。初识初一在联中的时候有社团班,当时我们班很大一部分同学选择了”信息学“,每周有一个下午去到机房学习编程。后来
参考:https://zhuanlan.zhihu.com/p/47075612https://docs.microsoft.com/zh-cn/windows/win32/debug/pe-format<加密与解密 第4版><Windows PE 权威指南>PE 基础概念PE文件是windows系统中遵循PE结构的文件,比如以.exe .dll为后缀名的文件以及系统驱动文件sys。具体PE文件类型:可执行系列:EXE,SCR;驱动程序系列:SYS,VXD;库
HTML<div> <img height="100" width="100" src="https://cdn.pixabay.com/photo/2018/08/14/13/23/ocean-3605547_960_720.jpg" class="pic"/> <img height="100" width="100" src="https://cdn.pixabay.com/photo/2011/12/14/12/21/orion-nebula-11
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。 关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》(当然,你也可以去读一下RFC793以及后面N多的RFC)。另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找...
(这个已经很老了,也是偶然发现)下载好了Tilt.xpi,安装Tilt.xpi时发现安装失败(安装失败,疑是文件损坏...)从网上找了很多文章,在浏览器输入about:config,修改xplinstall......,等等文章,都没有解决问题(可能问题不同解决方法不同),后来亲测发现原来是火狐浏览器版本不对,自己搞了一个火狐6.0版本的,终于实现了3D效果(效果如图),最后会附上浏览器和...
推荐序前言第1章 AI时代:图像技术背景知识11.1 人工智能的前世今生21.2 AI与CV的相互融合之路31.3 AI图像处理技术51.4 本章小结7第2章 武器和铠甲:开发环境配置82.1 来自传承的馈赠:OpenCV开源跨平台机器视觉库82.1.1 OpenCV的整体概念92.1.2 OpenCV的应用领域92.1.3 OpenCV的编程语言92.1.4 OpenCV支...
打开系统并登录root1、下载安装jdk8所有文件,运行下面命令yum install java-1.8.0-openjdk* -y2、检测版本,是否安装成功java -version3、配置环境变量,打开profile文件vi /etc/profile4、按“insert”键可以进行编辑文件,在文件最后面添加以下内容安装的JDK默认路径是:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64请根据个人的安装路径
U2FsdGVkX1/suxoBioxge0P6tG85reZ4VIyHam8GoYD1P4enO0EQwz3jxiXl5e3j6qHmEW7dBmPJdrdq0f+ALpg6gTvPhUBjYjCAfw4LGb6OBsSzL39NPuIx8FZMVzu7L4WYivcvsdyTfVx9XmGc4djEXWyK9GDznHUzH/diI7afykaDXi1jsPWwO/hEBhO5F7CyB...
为什么80%的码农都做不了架构师?>>> ...
一、Java基础 1、Java中枚举类型Enum的一种使用方式 2、Java性能优化之字符串优化处理 3、Java面试题问与答:编译时与运行时 4、Java中OIO与NIO的简单区别 5、为什么Java中1000==1000为false而100==100为true? 6、如何做到...