本篇是介绍C++的构造函数的第一篇(共二篇),属于读书笔记,对C++进行一个系统的复习。

构造函数的概念和作用

全局变量未初始化时为0,局部变量未初始化时的值却是无法预测的。这是因为,全局变量的初始化是再程序装载时便一次性完成的,自动地初始化为零并不会有额外的开销,因此编译器默认初始化为零。但是对局部变量并没有这样的操作,需要程序去完成初始化。

基本类型变量的初始化只需要在定义时赋值就可以了,但是对于对象的初始化,情况就要复杂一些。比如,有的对象需要在创建时就令某个指针指向一块内存空间,这就涉及到空间的分配;再比如,有的对象包含文件操作,在创建时就需要打开特定文件。举这两个例子是要说明,对象的初始化,不仅仅是简单赋值那么简单。因此构造函数(constructor)是必要的,它的存在就是为了完成对象的初始化工作。

构造函数名字和类名一样,没有返回值,可以重载。可以有多个构造函数,如果没有就自动生成一个默认的构造函数,但是它什么也不做。

默认构造函数

自动生成的构造函数是一个没有参数的构造函数。但凡自己已经写了一个构造函数,都不会自动生成无参的构造函数。不论是程序员自己写的无参构造函数还是自动生成的无参构造函数,只要是无参构造函数,就称为默认构造函数。那么,考虑下面一种情况:程序员只写了有参的构造函数,这种情况下就不存在默认构造函数。所以默认构造函数不一定存在,或者说无参的构造函数不一定存在。为什么要强调无参的构造函数不一定存在,有没有哪种构造函数一定是存在的呢?复制构造函数是一定存在的,在后文介绍。

对象在生成的时候一定会调用某个构造函数初始化,而对象一旦生成,就再也不会在其上调用构造函数。

构造函数是负责内存的分配吗?不是的,它只负责初始化。所以创建一个对象的过程是,先内存分配(在堆或栈上),之后在分配好的内存上调用构造函数。

构造函数在数组中的使用

像 int a[3] = { 0 ,1 ,2 }; 这样的语句就实现了数组的初始化。如何给一个对象数组初始化呢,可以使用类似的方法。

1 class CNum {
2
3 int num;
4 public:
5
6 CNum(){ num = 0;}
7 CNum(int a){ num = a;}
8 CNum(int a, int b){ num = a + b;}
9 }

可以这样调用:

1 CNum n1[3];                   //调用了三次无参构造函数,结果是{0,0,0}
2 CNum n2[3] = {0, 1, 2};           //调用了三次CNum(int a),结果是{0,1,2}
3 CNum n3[3] = {0, 1};             //调用了两次CNum(int a),和一次无参构造函数,结果是{0,1,0}
4 CNum n4[3] = {0, CNum(1,2), CNum(2,3)};  //调用了一次无参构造函数和两次CNum(int a, int b),结果是{0,3,5}

想在堆上生成数组可以这样:

1 CNum * ptrnum[3] = {new CNum(1,2), new CNum(2,3)};

这样生成的实际上是一个指针数组,前两个元素指向的对象使用了CNum(int a, int b)初始化,第三个元素没有初始化,是一个野指针(请避免这样做)。所以这一个语句实际上调用了两次构造函数。

转载于:https://www.cnblogs.com/painterQ/p/7003814.html

C++构造函数(一)相关推荐

  1. 派生类参数初始化列表和基类构造函数顺序

    今天被问到了一个问题,随便回了一句,父类还没有构建,怎么能初始化父类的成员. 派生类构造函数的参数初始化列表,为什么不能初始化基类的成员? 例如下面的是不可以的 class Rectangle : p ...

  2. C++ 复制构造函数或者拷贝构造函数

    复制构造函数 是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象. 复制构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象. 复制对象把它作为参数传 ...

  3. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)

    1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...

  4. php构造和析构方法,php5构造函数与析构函数实例

    自php5起,有了构造函数与析构函数. 这使得php更富有面向对象的魅力了. 在php4时,构造函数用的是与类同名的函数来进行构造这个动作. 例如: 复制代码 代码示例: /* * myclass.p ...

  5. java super快速生成_为什么当我使用编辑器代码生成器时,eclipse会在构造函数中自动添加一个java super()方法?...

    正如@Kon在他的评论中提到的, Java中的一个空构造函数包含对超类构造函数的隐式调用. 此外,没有明确调用super()的非空构造函数将在顶部具有隐式调用. 离开super()调用是唯一的时候,如 ...

  6. 【C++】何时需要自定义拷贝构造函数和赋值符

    先来说结论:当类中有指针类型成员变量的时候,一定要自定义拷贝构造和赋值运算符 原因:当我们在有指针类成员变量的时候,还是用默认拷贝构造函数(拷贝构造函数执行的时候会调用赋值符),默认赋值为浅拷贝,会导 ...

  7. 对象特性-----拷贝构造函数的调用

    C++中拷贝构造函数调用通常三种情况: ****使用一个已经创建完毕的对象来初始化一个新对象 ****值传递的方式给函数参数传值 ****以值方式返回局部对象 #include<iostream ...

  8. 对象特性-构造函数和析构函数

    基础概念: 构造函数:是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或 ...

  9. C++:构造函数作用及用法

    PS:写在前面 就是构造函数的作用可以这样理解,如果没有构造函数就是类里边只是声明了成员变量,成员函数,还有最后的对象,这样你在对该对象进行初始化赋值时就比较麻烦就得先调用成员函数对成员变量赋值,成员 ...

  10. C++ 拷贝构造函数和重载赋值运算符的区别

    文章目录 拷贝构造函数 重载赋值运算符 赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成,而拷贝构造函数会生成新的对象. 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别,将详细通 ...

最新文章

  1. 如何写出一手好的业务代码?
  2. [QA] MySQL Error 1050(42S01): Table already exist
  3. C++ primer 1.2 初窥输入输出流
  4. python合并多个txt文件_python如何合并多个txt文件删除所有重复行并生成新文件
  5. HDU 2277 Change the ball
  6. arcmap中使用python_ArcMap - 使用python更新列中的值
  7. pytorch 回归预测(时间序列)
  8. [leetcode]5169. 日期之间隔几天
  9. C语言调用拼多多api,vb CommonDialog 属性
  10. python中element什么意思_什么是Python中等效的’nth_element’函数?
  11. 「macOS」“邮件”添加账户指南
  12. distinct和order by冲突
  13. 一周上手flutter
  14. 百度浏览器的编程html,百度来路浏览器劫持代码(替换浏览器正在浏览页面)...
  15. Spring Boot搭建Web服务器,实现用户注册登录功能
  16. 我在51CTO微职位学软考——东隅已逝,桑榆非晚
  17. eclipse平台的手机程序开发步骤整理
  18. Sketch教程如何实现背景局部模糊
  19. MySQL数据库初体验
  20. 【模拟IC】系统频率稳定性分析与极点补偿技术介绍

热门文章

  1. 压力变动力,存储追求高效率
  2. docker 安装 oracle12,使用Docker安装Oracle 12c
  3. 播客#47:劳伦斯·布拉德福德
  4. 在JavaScript中重复字符串的三种方法
  5. 给windows装个Mac黑苹果虚拟机
  6. autowired java_Java 基础之Autowired 是否是自动注入
  7. 脱离公式谈谈对反向传播算法的理解
  8. Python组合数据类型之集合类型
  9. 哪些人适合学习java技术
  10. Java入门学习注意事项有哪些?