c++ 构造函数

构造函数:

类通过一个或几个特殊的成员函数来控制其对象的初始化进程,这些函数叫构造函数。构造函数的任务是初始化类对象的数据成员。

构造函数名字和类名相同,构造函数没有返回类型。构造函数也有一个可能为空的参数列表和一个可能为空的函数体。

构造函数不能被声明成const的,构造函数在const对象的构造过程中可以向其写值。

1.默认构造函数:

  • 如果我们没有为对象提供初始值,那么他们执行了默认初始化。类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫默认构造函数。如果我们的类没有显式定义构造函数,编译器隐式的定义一个默认构造函数。
  • 默认构造函数按如下规则初始化类的数据成员:如果存在类内的初始值,用它来初始化成员。否则,默认初始化该成员。
  • 某些类不能依赖与合成的默认构造函数:
    • 编译器只有发现类不包含任何构造函数的情况下,才能替我们生成一个默认的构造函数。一旦我们定义了一些其他的构造函数,除非我们再定义一个默认的构造函数,否则类将没有默认构造函数。
    • 对某些类来说,合成的默认构造函数可能执行错误的操作。含有内置类型或复合类型成员的类需要在类的内部初始化这些成员,或者定义一个自己的默认构造函数。否则用户在创建类的对象时采用默认初始化,导致这些对象的值是未定义的。
    • 有时编译器不能为某些类合成默认构造函数。如果类中包含一个其他类类型的成员,而且这个成员没有默认构造函数,那么编译器将无法初始化该成员。

2.定义构造函数:

struct Sales_data{Sales_data() = default;Sales_data(const std::string &s) : bookNo(s) { }Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p*n) { }Sales_data(std::istream &);//之前已经有的其他成员std::string isbn() const { return bookNo; }Sales_data& combine(const Sales_data&);double avg_price() const;std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};
  • 定义默认构造函数:

    Sales_data() = default;

    该构造函数不接受任何实参,所以他是一个默认构造函数。我们定义这个构造函数的目的是因为我们既需要其他形式的构造函数,也需要默认的构造函数。

    如果我们需要默认的行为,可以通过参数列表后面写上 = default 来要求编译器生成构造函数。

    =default可以和声明一起出现在类的内部也可以在作为定义出现在类的外部,在内部,默认构造函数是内联的。

  • 构造函数初始值列表

     Sales_data(const std::string &s) : bookNo(s) { }Sales_data(const std::string &s, unsigned n, double p): bookNo(s), units_sold(n), revenue(p*n) { }//使用前两个参数初始化bookNo和units_sold,revenue 的初始值通过n和p相乘得到。
    

    :以及:和{}之间的代码,称为构造函数初始值列表。

    它负责为新建的对象的一个或几个数据成员赋初值。这个列表是成员名字的一个列表,括号里面是成员初始值,不同成员初始化通过逗号分隔。

    只有一个string类型参数的构造函数使用这个string 对象初始化bookNo,对于units_sold和revenue则没有显式初始化,某个数据成语被构造函数初始值列表忽略,它将以与合成默认构造函数相同的方式隐式初始化。

    Sales_data(const std::string &s) : bookNo(s) { }
    //下面与上面的构造函数效果相同:
    Sales_data(const std::string &s) : bookNo(s), units_sold(0), revenue(0) { }
    

    构造函数唯一目的就是为数据成员赋初值,一旦没有其他任务需要执行,函数体也就空了。

  • 构造函数和类内初始值:

    我们使用= default来要求编译器生成默认构造函数,是因为我们为内置类型的数据成员提供了初始值,如果编译器不支持类内初始值,那么默认构造函数就应该使用构造函数初始化列表。

    如果编译器不支持类内初始值,则所有的构造函数都应该显式初始化每个内置类型成员。

  • 在类的外部定义构造函数:

    Sales_data::Sales_data(std::istream &is){read(is, *this);
    }
    

    这个构造函数的构造函数初始值列表是空的,但是由于执行了构造函数体,所以对象的成员仍然能被初始化。

    没有出现在构造函数初始值列表中的成员将通过相应的类内初始值初始化,或者执行默认初始化。一旦函数开始执行,bookNo将被初始化为空string对象,units_sold和revenue将是0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js java post提交_如何从Express.js发送Post请求到另一个服务器(Java)?

小编典典您正在重复请求,并为发布请求重新分配变量。我已经更新了您的代码并与requestb.in一起对其进行了测试var express require(express);var querystring require(querystring);var http require(http);var app express();app.get(/, function (req, res) {…

c++ 访问控制与封装

访问控制与封装 文章目录访问说明符:友元:封装好处:class Sales_data{public://作为接口的一部分,构造函数和部分成员函数isbn,combine紧跟在public说明符之后。Sales_data() default;Sales_data(const std::string &…

c++ 命名空间的using声明

命名空间的using声明: 除了内置类型之外,c语言还定义了一个内容丰富的抽象数据类型库。 访问库中名字的一个简单方法就是通过using。 我们用到的库函数基本上都属于命名空间std,可以通过::(作用域操作符)从左侧作用…

mysql工作中遇到的问题_MySQL工作中遇到的问题记录

1:log_slave_updates:从库1搭建级联从库2,从库1需要开启log_slave_updates,修改/etc/my.cnf,增加一行log_slave_updates1,重启数据库。http://blog.itpub.net/12679300/viewspace-1319263/2:ERROR 1418 (HY…

java 基本格式

java基本格式: 所有的java程序必须放在一个类之中才可以执行。 主方法main是整个java程序的入口,所有程序都是从public static void main(String[] args)开始运行的。 类定义有两种形式: public class:文件名和类名一致。每一个*.java文件…

用java画海绵宝宝_java 方法的重载

方法的重载:一个类中允许出现一个以上的同名方法,必须保证同名方法的参数列表不同好处:方便阅读,优化程序设计重载规则:重载方法名相同,但每个重载方法都必须有一个独一无二的参数类型列表,方法…

Java 构造方法

Java构造方法: 通过构造方法,在对象最初被创建时就完成对其成员变量的初始化。 构造方法特点: 构造方法名称和类名相同。构造方法不返回任何数据,也不用void声明。在创建对象时,系统自动调用类的构造方法。构造方法…

ajax 链接java_如何使用ajax将下拉菜单链接到表

以下是实现您的功能的示例静态代码 . 您可以使用sql和php添加动态内容 .的index.phpCource 1Cource 2Cource 3Cource 4$("#courses").change(function(){var course $(this).val();$.post(data.php, {course: course}, function(response){// your drop down box is…

Java 作用域修饰符

Java作用域修饰符 在java语言中,可以使用访问修饰符来规定对类、变量、方法和构造方法的访问。 文章目录一、访问修饰符二、非访问修饰符一、访问修饰符 1.私有的访问修饰符private: 声明为私有访问类型的变量只能通过类中的公共方法被外部类访问。 …

python xgboost实战_史上最详细的XGBoost实战

0. 环境介绍Python 版 本: 3.6.2操作系统  : Windows集成开发环境: PyCharm1. 安装Python环境安装Python首先,我们需要安装Python环境。本人选择的是64位版本的Python 3.6.2。去Python官网https://www.python.org/选择相应的版本…

java web导入tomcat_记一次在服务器上导入javaweb 项目的经历---tomcat服务器-Go语言中文社区...

1. 导入数据库远程linux服务器mysql数据库导入和导出.sql文件大部分情况本地开发环境为windows,部署的服务器为Linux,本地数据库导出.sql文件后需要远程导入服务器,具体如下。首先连接服务器,即服务器ip,协议&#xff…

Java 创建对象

Java 创建对象 声明:Person p1; 声明一个对象,包括对象名称(p1)和对象类型(Person)。 实例化:p1 new Person(); 使用关键字new创建一个对象。 声明和实例化连起来可以写成:Person …

java 2d绘图 stroke_Java标准教程:Java 2D绘图--第4章使用Text

Java标准教程:Java 2D绘图--第4章使用Text本节介绍文本API的用法,以及他们的渲染能力。至今为止,您已经有了基本的Java 2D文本API,同时知道如何设置字体和位置,以及绘制文本。本节扩展了这些知识,同时更深入…

java 对象引用传递

java对象引用传递 引用传递也称为传地址,实际参数的引用(地址)被传递给方法中对应的形式参数,在方法中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数改变将影响实际参数。 传引用的数据…

java 定义和导入包

java定义和导入包: 为了更好地组织类,java提供了包机制。把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。同一个包中的类名不同,不同包中类名可以相同。同时调用两个不同包中相同类名的类时,应该加…

c++ int自动转换成无符号变量产生的问题

c int自动转换成无符号变量产生的问题 无符号对象不会小于零&#xff0c;尽管我们不会故意给无符号对象赋一个负值&#xff0c;但可能写出这样的代码。 1.当一个算数表达式中既有无符号数又有int值时&#xff0c;那个int值就会转换成无符号数。 #include<iostream> us…

php 年月日 中文,php Date()函数输出中文年月日时分秒_PHP教程

今天我以一个简单的利用date()函数输出中文年月日时分秒引出关于大多数据用户在使用php date()函数的一些问题与date()函数一些参数详解。当然了&#xff0c;PHP的DATE函数是不可能直接输出中文的年月日的&#xff0c;但可以用下面这种方法自己写一个函数。代码如下复制代码fun…

c++ 标准库类型string

标准库类型string string表示可变长的字符序列&#xff0c;使用string类型必须首先包含string头文件。 文章目录一、定义和初始化string对象二、操作string对象三、处理string对象中的字符一、定义和初始化string对象 如何初始化类的对象是由类本身决定的。 1.拷贝初始化&am…

php防止跨域提交,PHP防止跨域提交表单的简单示例

这篇文章主要为大家详细介绍了PHP防止跨域提交表单的简单示例&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小玲来看看吧&#xff01;在写用户注册的时候,一定要主要你的表单是否可以跨域提交.php中解决的方法…

php李捷,【问题解答】蝶泳手外划的作用

一直以来总是弄不明白&#xff0c;蝶泳手外划的作用&#xff0c;以及正确的外划动作&#xff0c;请指教。”我&#xff1a;先上两个图&#xff0c;您自己分析一下&#xff1a;我&#xff1a;蝶泳的划手路线和打腿的幅度和力度是相匹配的&#xff0c;如果打腿幅度小频率快&#…