参考:http://www.weixueyuan.net/view/6339.html

总结:

  如果在类中声明了任何一个构造函数,则系统不会自动生成默认构造函数。构造函数同样能够使用类中的成员变量。

  构造函数就是用于初始化对象的,并且负责处理对象创建时需要处理的其它事务,在创建对象时会被自动调用。

  构造函数除了自身独有的三个特性以外,其它与普通成员函数类似,可以完成普通函数能完成的所有功能,如函数调用、条件判断、循环、赋值等,如下例所示。

构造函数是类中一种特殊的成员函数,其特殊之处有三点:

  • 构造函数的函数名必须与类名相同;
  • 构造函数无返回值;
  • 当我们创建类对象的时候构造函数会被自动调用,而无需我们主动调用。

一个类中可以有多个构造函数,构造函数之间构成函数重载的关系。

[例1] 构造函数举例:

#include<iostream>
using namespace std; class book
{
public:
book(){}
book(char* a, double p);
void setprice(double a);
double getprice();
void settitle(char* a);
char * gettitle();
void display();
private:
double price;
char * title;
}; book::book(char* a, double p)
{
title = a;
price = p;
} void book::display()
{
cout<<"The price of "<<title<<" is $"<<price<<endl;
} void book::setprice(double a)
{
price = a;
} double book::getprice()
{
return price;
} void book::settitle(char* a)
{
title = a;
} char * book::gettitle()
{
return title;
} int main()
{
book Alice;
Alice.settitle("Alice in Wonderland");
Alice.setprice(29.9);
Alice.display();
book Harry("Harry Potter", 49.9);
Harry.display();
return 0;
}

本例中定义了一个book类,在该类中定义了两个private属性的成员变量price和title,定义的成员函数有6个,后面四个在前几节中已经介绍过了,两个函数book()和book(char * a, double p)即为需要介绍的构造函数。这两个函数无返回值,函数名与类名相同,这是构造函数最明显的特征。

构造函数与普通成员函数类似,可以在类内部定义,也可以在类外部定义。第一个没有参数的构造函数book(),其定义就在类内部;第二个构造函数book(char * a, double p)在类内部声明,类外部定义。

通常如果在定义类的时候,程序设计人员没有主动声明任何一个构造函数的时候,系统会自动生成一个默认构造函数,默认构造函数就是不带任何参数的构造函数。其它带参数的构造函数统称为带参构造函数。

如果在类中声明了任何一个构造函数,则系统不会自动生成默认构造函数。构造函数同样能够使用类中的成员变量。

构造函数的作用在本例中也可以很清楚的看出来。构造函数就是用于初始化对象的,并且负责处理对象创建时需要处理的其它事务,在创建对象时会被自动调用。

本例中的主函数中,先定义了一个Alice对象,该对象其实在创建的时候已经自动调用了默认的构造函数的。若我们在类定义的时候不定义默认构造函数,则book Alice;这一句创建对象的语句则会出现编译错误,因为我们创建了带参构造函数,故默认构造函数不会被自动创建,因此在用book Alice;语句创建对象的时候无相应的构造函数能够调用,因此会初始化对象出错。

在主函数中,当我们创建Harry对象时,其后还跟有一个括号,里面还有两个参数,这一句创建对象会自动调用book(char * a, double p)构造函数进行对象的初始化,初始化之后,Harry.price = 49.9,而Harry.title = “Harry Potter”,因此在调用Harry.display()函数的时候,能够打印出“The price of Harry Potter is $49.9”也是不足为奇的。

构造函数除了自身独有的三个特性以外,其它与普通成员函数类似,可以完成普通函数能完成的所有功能,如函数调用、条件判断、循环、赋值等,如下例所示。

[例2] 在构造函数中调用函数:

  1. class book
  2. {
  3. public:
  4. book(){}
  5. book(char* a, double p){init(a,p);};
  6. void setprice(double a);
  7. double getprice();
  8. void settitle(char* a);
  9. char * gettitle();
  10. void display();
  11. void init(char* a, double p);
  12. private:
  13. double price;
  14. char * title;
  15. };
  16. void book::init(char* a, double p)
  17. {
  18. title = a;
  19. price = p;
  20. }
 

2.7 C++构造函数的更多相关文章

  1. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  2. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  3. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  4. PHP与JAVA构造函数的区别

    早期的PHP是没有面向对象功能的,但是随着PHP发展,从PHP4开始,也加入了面向对象.PHP的面向对象语法是从JAVA演化而来,很多地方类似,但是又发展出自己的特色.以构造函数来说,PHP4中与类同 ...

  5. C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...

  6. golang语言构造函数

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

  7. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  8. Aop动态生成代理类时支持带参数构造函数

    一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...

  9. C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?

    Review后看到标题让我十分羞愧自己语文功底太差,估计...请见谅......我还特地把这句写回开头了...... 问题 前天遇到的一个问题,所以在MSDN发了个问,刚也丰富了下问题,关于泛型的. ...

  10. Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

    零.序 一.自定义Style 二.在XML中为属性声明属性值 1. 在layout中定义属性 2. 设置Style 3. 通过Theme指定 三.在运行时获取属性值 1. View的第三个构造函数的第 ...

随机推荐

  1. (转)C# Textbox的ImeMode取值对中文输入法的影响

    取值 五笔加加 微软拼音3.0 搜狗拼音 说明 NoControl 首次调出后按一次ctrl+space才能正确使用 中西标点或全半角字符继承上次设置 调出后默认为英文输入状态  调出后默认为西文标点 ...

  2. 记一次RAID阵列的迁移经历

    xu言: 最近,某电信机房因为空调漏水问题导致了我司的Dell R430 服务器的主板及CPU不同程度受损.服务器已经不能正常开机.但是,又基于把服务器的数据需要最短时间进行恢复.抱着试试看的心里进行 ...

  3. C# 测试代码段性能耗时

     一:              DateTime BeginTime = System.DateTime.Now;            //代码            DateTime EndTi ...

  4. 20180831xlVBA_WorkbooksCosolidate

    Sub WorkbooksConsolidate() Rem 设置求和区域为 sheet名称/单元格区域;sheet名称/单元格区域 Const Setting As String = "S ...

  5. Build Castles(构建城堡)

    Charlemagne, the King of Frankie, 英文描述 请参考图片中的说明. 中文描述 根据给出的数组确定能够盖多少城堡. 思路和点评 我不能确定我的思路是正确的,也欢迎大家参与 ...

  6. vux, vue如何控制微信自带的返回按钮,让其返回其他页面?

    <script> import { mapState } from 'vuex' export default{ name: 'clockFx', data () { return { } ...

  7. Java中遍历实体类(处理MongoDB)

    在实际过程中,经常要将实体类进行封装,尤其是处理数据库的过程中:因此,对于遍历实体类能够与数据库中的一行数据对应起来. 我是使用的环境是Spring boot,访问的数据库时MongoDB 实体类遍历 ...

  8. 重写TreeMap的compare方法处理配置表

    需要处理的配置表如下: 接上一篇的优化,接着优化,优化代码如下:  这段代码的关键在于重写TreeMap的compare方法. 关于如何重写TreeMap的compare方法,以及返回值代表的意义,可 ...

  9. IDEA能运行,但是出现红色下划线的问题报 cannot resolve method

    能编译通过并运行说明SDK导入正确,但是为啥我们点击每一个Java文件会出现好多红色的下划线 ,并提示idea cant resolve symbol.原因就是可能没有清除原来的历史缓存,导致一些错误 ...

  10. js的正则表达式的替换

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...