构造函数的名字和类的名字相同,没有返回类型,在类的public域定义或声明。

使用构造函数的三类方式:

1)显示调用:e.g. Stock food = Stock("World Cabbage", 250, 1.25);

2)隐式调用:e.g. Stock garment("Furry Mason", 50, 2.5);

3)new:e.g. Stock *pstock = new Stock("Electric", 18, 19.0); //这种情况下,创建了一个没有名字的Stock对象,将这个对象的地址赋给pstock,通过指针pstock使用这个对象。

默认构造函数:

默认构造函数没有形参表。如果用户没有定义任何构造函数,编译器会自动生成一个默认构造函数。但编译器自动生成的默认构造函数不做任何事,e.g. Stock::Stock() {}。这样带来的结果就是, e.g. Stock st; st中的成员都未初始化。

如果用户定义了任何构造函数,那编译器就不会提供默认构造函数,用户必须自己定义默认构造函数。如果用户定义了带形参的构造函数,但没有定义默认构造函数,那如下的情况将会报错:

Stock stock1; // Error, no default constructor

定义自己的默认构造函数有两种方式:

1)隐式初始化:在默认构造函数体内对数据成员赋值

e.g. Stock::Stock()

{     //在执行函数体之前,其实成员变量已经初始化过了,即company="", shares和share_value值未知

company = "no name";

shares = 0;

share_value = 0.0;

}

2)显式初始化:在默认构造函数初始化列表中对数据成员初始化

e.g. Stock::Stock: company(""),shares(0),share_value(0.0) {}

初始化列表只在构造函数的定义中而不是声明中指定。

一般情况下,这两种方式没有差别,但2)效率更高,建议使用2)。

但有些情况下,只能使用2)来初始化数据成员。当类的成员中有const引用类型成员以及没有默认构造函数的类类型成员时,必须使用2)。因为对于const成员或引用类型成员,只能初始化,不能对他们赋值;对于没有默认构造函数的类类型成员,若采用1),则给它赋值之前其实它已经被创建,但因没有默认构造函数,所以会创建失败,因此也只能用2)初始化。

在使用2)时,成员被初始化的次序就是定义成员的次序,与初始化列表中的次序无关。

使用默认构造函数的几种情况:

1) Stock first;//隐式调用默认构造函数

2) Stock first = Stock();//显示调用默认构造函数

3) Stock *pst = new Stock;//隐式调用默认构造函数

4) Stock *pst1 = new Stock();//显示调用默认构造函数

Stock second(); // 错误,这是声明一个返回类型为Stock的函数,不是声明对象。

注意:内置或复合类型的成员的初始值依赖于对象的作用域:在局部作用域中这些成员不被初始化,而在全局作用域中它们被初始化。

e.g.

class base
{
private:int a;double b;
};base A;//a=0,b=0.0main()
{}   int a;double b;
};base A;//a=0,b=0.0main()
{}
class base { private:  int a;  double b; }; main() { base B; //如果没有default constructor,则a,b均未初始化,没有初始值 } int a;  double b; }; main() { base B; //如果没有default constructor,则a,b均未初始化,没有初始值 }

[C++] - 类的构造函数constructor相关推荐

  1. JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态

    一.认识class定义类 我们会发现,按照前面的构造函数形式创建 类,不仅仅和编写普通的函数过于相似,而且代码并不容易理解. 在ES6(ECMAScript2015)新的标准中使用了class关键字来 ...

  2. 类和模块 类和原型 工厂方法 构造函数 constructor

    类和模块 每个js的对象都是属性的集合.相互之间没有联系. js也能定义对象的类,让每个对象都共享某些属性. 类的成员或者实例包含一些属性,用来存放或者定义他们的状态.有些属性定义了其行为,(行为或者 ...

  3. eclipse文档注释设置、文件(Files)注释标签、类型(Types)注释标签(类的注释)、字段(Fields)注释标签、构造函数(Constructor)标签

    文章目录 1.文件(Files)注释标签 2.类型(Types)注释标签(类的注释) 3.字段(Fields)注释标签 4.构造函数(Constructor)标签 5.方法(Methods)标签 6. ...

  4. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  5. java反射类带构造函数_java中反射类的加载和构造函数

    我们先创建了一个Person类 package reflect; public class Person { public String name = "zhangsan"; pu ...

  6. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  7. 派生类中构造函数与虚构函数的研究

    1.继承过程中的构造函数 A:继承与派生过程中,基类的构造函数不能被继承,派生类中需要声明自己的构造函数. B:声明构造函数时,只需要对本类中新增成员进行初始化.至于基类继承过来的成员,应该调用基类的 ...

  8. php 派生类 构造,C++派生类的构造函数和析构函数

    派生类对象中包含基类对象,因此派生类对象在创建时,除了要调用自身的构造函数进行初始化外,还要调用基类的构造函数初始化其包含的基类对象.因此,程序中任何能够生成派生类对象的语句,都要说明其包含的基类对象 ...

  9. C++关于虚基类、构造函数、析构函数、成员对象的两个程序浅析

    预备博客: C++虚继承中构造函数和析构函数顺序问题以及原理 C++派生类含有成员对象构造函数析构函数顺序 C++虚基类成员可见性 程序一如下: #include<iostream> us ...

最新文章

  1. html 边框循环变色,方框用过渡走一圈变色用css怎么实现
  2. java参数注解pam_java – 使用xmlelement defaultvalue注释指定默认值的简单方法
  3. 5.OD-条件断点、条件记录断点
  4. Sentinel(十五)之在生产环境中使用 Sentinel
  5. Vxworks增加system call
  6. flutterapp部分手机无法打开_Flutter run无法在iPhone上打开应用,直接在iphone也无法打开...
  7. POJ-3469 Dual Core CPU 最小割最大流
  8. 特斯拉FED在美售价上调至1.2万美元 国内售价6.4万元
  9. UVA12265-Selling Land(细节处理)
  10. c++语言函数参数传递方式,C++函数传递三种方式解读
  11. 北斗三号频点_解码北斗三号
  12. vue电子数字、时钟数字、的字体引入和使-详细步骤
  13. 2019最新个税计算_python
  14. 云授权系统服务器系统连接失败,金蝶云授权码连接不到服务器
  15. 微信小程序自定义组件使用阿里矢量图标库图标
  16. Mac电脑使用:您的安全性偏好设置仅允许安装来自App Store和被认可的开发者的应用(解决方法)
  17. 九 iOS之 图片剪裁
  18. Java实现日志数据的采集显示
  19. Android_001_校园APP_001_底部导航栏_Fragment_0
  20. orchestrator配置参数详解-Ⅱ

热门文章

  1. python中request方法_如何使用python语言中的request模块获取代码
  2. java线程的状态有几种_Java线程的几种可用状态
  3. linux文件编码无法修改,在Linux系统中修改文本的字符编码的方法
  4. 深入理解Java类加载器(2)
  5. Python类私有方法的陷阱
  6. Extjs创建多个application实现多模块MVC动态加载。。
  7. 泛海精灵软件预发布统计报告 反馈
  8. 输入和用户界面——总结
  9. ASP.NET中的事件处理
  10. 求一列数据中的波峰_pandas查看缺失数据占比(实战)