没有合适的资源?快使用搜索试试~ 我知道了~
构造函数是C++的一个很基础的知识点,在平时编程的时候,相信大家都很熟悉,虽然比较基础,但是细究下来,还是有不少细节需要注意。这篇文章主要总结C++构造函数需要注意一些细节,一方面,可以帮助下大家巩固下这方面知识。同时,也是有助于自己更好得整理以前的知识。 让我们由一个对象的创建开始。当一个对象创建的时候,编译器会调用这个对象的构造函数,在这个时候,或许大家会有疑问了:我并没有为对象指定构造函数,那么编译器调用的构造函数由哪里来呢? 有这点疑惑是一个好的开始,那么当我们没有指定构造函数时,编译器调用的构造函数由哪里来呢?,答案是编译器会自己为对象产生所需的构造函数。 那么现在
资源详情
资源评论
资源推荐
C++的构造函数总结的构造函数总结
构造函数是C++的一个很基础的知识点,在平时编程的时候,相信大家都很熟悉,虽然比较基础,但是细究下来,还是有
不少细节需要注意。这篇文章主要总结C++构造函数需要注意一些细节,一方面,可以帮助下大家巩固下这方面知识。同时,
也是有助于自己更好得整理以前的知识。
让我们由一个对象的创建开始。当一个对象创建的时候,编译器会调用这个对象的构造函数,在这个时候,或许大家会有
疑问了:我并没有为对象指定构造函数,那么编译器调用的构造函数由哪里来呢?
有这点疑惑是一个好的开始,那么当我们没有指定构造函数时,编译器调用的构造函数由哪里来呢?,答案是编译器会自
己为对象产生所需的构造函数。
那么现在又有了两个问题:
>1.编译器在什么条件下会为我们自动生成默认构造函数?
>
>2.自动生成的构造函数主要做了什么?
我们先来回答问题1,答案是:
>在我们没有对象指定构造函数的时候,编译器会为我们生成默认构造函数,拷贝构造函数,默认析构函数。
这样的话,无论我们使用通过new,拷贝来构造一个对象都可以完成了。在此需要提及一下拷贝构造函数和赋值构造函数
的区别,请看下例:
class Obj{}; // 声明一个对象Obj
Obj a; //调用默认构造函数来构造对象
Obj b(a);//调用默认拷贝构造函数来构造对象
Obj c = b;//调用的也是拷贝构造函数,好将其写做 Obj c(b)。
所以,当我们不需要编译器生成的构造函数时,应该明确说出来,即如果们声明自己的构造函数,拷贝构造函数的话,编
译器不会为我们生成这些函数了。
通过利用这点我们可以限制对象的产生,例如,我们将默认构造函数,拷贝构造函数声明为私有,可以防止外界来产生这
个对象,这点主要是在单例模式中使用。
在上面我们了解了编译器会自动为对象生成函数的条件。下面来看第二个问题。
在这个问题中,包含了两个构造函数:默认构造函数和拷贝构造函数。下面我们将分别回答这个问题。
1.编译器生成的默认构造函数主要做了什么?
实际这个问题中的表述是不准确的,因为按照标准,编译器只在需要的时候产生才产生一个符合编译器要求的默认构造函
数,其他情况下是不会产生一个默认构造函数,因为是不需要的。那么什么是需要的时候呢?答案如下:
>1.内部的成员变量拥有默认构造函数,如果有多个成员变量,那么会按照成员变量声明的顺序来调用成员变量的默认构
造函数。
>2.基类拥有默认构造函数。在子类构造的时候,需要先构造父类。
>3.类中声明有虚函数,因为编译器需要为类中的虚函数表指针指定正确的地址。
>4.带有虚基类(virtual base class)。因为编译器需要确定下来虚基类在对象中的偏移,以方便调用虚基类中数据。
上面四种情况下,编译器会为对象合成默认构造函数,而通过上面的情况,也可以知道编译器合成的默认构造函数做了什
么(此知识点在《深度探索C++对象模型中》详细描述)。同时也要注意一点:编译器合成的默认构造函数并没有初始化成员
变量,如果要为成员变量在构造是指定特定的值,需要在自定义的构造函数中来指定。
第一个问题可以告一段落,下面我们来看默认拷贝构造函数做了什么。
回答这个问题前,我们再来回顾下拷贝构造函数的调用时机,在以下三种情况下会调用对象的拷贝构造函数
>1.以一个对象的值作为另一个对象的初值。例如:
class Obj{};
Obj a;
Obj b = a;
Obj c(a);
>2.当作为函数的参数时。例如:
class Obj{};
void Foo(Obj obj);
>3.当作为函数的返回值时。例如:
class Obj{};
Obj foo()
{
Obj obj;
return obj;//调用拷贝构造函数。
}
由上面第二种情况可知,**在函数中使用引用传参可以减少对象的构造**。
了解完拷贝构造函数的调用时机,我们再来看看编译器生成的默认拷贝构造函数都做了什么。默认拷贝构造函数主要作用
是按位拷贝,在必要的时候,除了按位拷贝,还插入一些其他行为,具体内容请看先前的文章—-[C++拷贝构造函数总结]
(http://www.cnblogs.com/yetuweiba/p/3390853.html)。在实现拷贝构造函数中我们需要注意一点深拷贝和浅拷贝,防止出现
的拷贝不完全的错误。
以上是构造函数的语法基础知识点,根据上面的原理,可以总结出来一些容易出错的地方,具体请看下面。
>1.如果对象拥有成员变量,需要在自定义构造函数中设定初值,尽可能地使用成员初始化列表对成员变量进行初始化。
同时,成员变量是按照声明的顺序来构造的,所以,要注意依赖。
在构造函数中对成员变量进行初始化的话,在编译器中实际上是先调用此成员变量的构造函数,再调用它的赋值函数,所
以,使用成员初始化列表会节省效率。
成员变量的构造是按照声明的顺序进行的,所以,不要让声明早的成员变量依赖声明晚的成员变量。示例如下
weixin_38635092
- 粉丝: 3
- 资源: 926
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 解决未在远程桌面会话中捕获到鼠标,vmguest.iso软件分享给大家
- JSP+SQL基于WEB的开放性实验管理系统设计与实现(源代码+论文+开题报告+中英文献+答辩PPT).rar
- log4net配置文件!!!!!!!!!!!!!!!!!
- 河南统计面板数据集(2010-2022年).xlsx
- OrcaleDBHelper帮助类!!!!!!!!!!!!
- log4net帮助类,用来写日志!!!!!!!!!!!!!
- Windows10时间同步源
- 信呼OA系统2.1.7版源码
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论10