原创笔记,转载请注明出处!

点击【关注】,关注也是一种美德~


一、默认构造函数

两个特殊的构造函数

1、默认无参构造函数

当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空;

2默认拷贝构造函数

当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值复制。

二、构造函数调用规则

1、当类中没有定义任何一个构造函数时,C++编译器会提供默认无参构造函数和默认拷贝构造函数;

2、当类中定义了拷贝构造函数时,C++编译器不会提供无参构造函数;

3、当类中定义了任意的非拷贝构造函数时(即,当类中提供了无参构造函数或有参构造函数),C++编译器不会提供无参构造函数;

4、默认拷贝构造函数成员变量简答赋值。

、案例分析

1、没有定义构造函数时C++调用默认无参构造函数(编译通过)

#include<iostream>

using namespace std;

class Function

{

private:

int a;

int b;

};

int main()

{

Function t1;

system("pause");

return 0;

}

上面程序中,我们没有定义构造函数,编译通过,C++自动调用默认无参构造函数。

 

2、定义有参构造函数,C++不提供默认无参构造函数

 

#include<iostream>

using namespace std;

class Function

{

//定义有参构造函数

Function(int x,int y)

{

a=x;

b=y;

}

private:

int a;

int b;

};

int main()

{

Function t1;

system("pause");

return 0;

}

看上面程序,定义一个有参构造函数,但是我们定义对象时候没有按照构造函数的参数形式进行赋值,这时候编译器会去寻找默认的无参构造函数,但是因为我们手动添加了有参的构造函数,因此编译器不再提供无参默认的构造函数,因此编译失败!

但是,如果我们定义对象时,提供跟有参构造函数形参形式相对应的调用,那么就可以编译通过。关于拷贝构造函数也是一致的。如下程序:

#include<iostream>

using namespace std;

class Function

{

public:

//定义有参构造函数

Function(int x,int y)

{

a=x;

b=y;

}

private:

int a;

int b;

};

int main()

{

Function t1(1,2);

system("pause");

return 0;

}

总结

1、如果你没自己手工写构造函数,那么就会自动调用默认的无参构造函数;

2、如果你自己写了构造函数(不管是有参构造函数还是拷贝构造函数),那么编译器就不会再提供默认的无参构造函数了,你在定义对象时,就要根据构造函数形参的形式进行传递参数。(待补充)

构造、析构阶段性总结:

(1)构造函数时C++中用于初始化对象状态的特殊函数;

(2)构造函数在对象创建时自动被调用;

(3)构造函数和普通成员函数都遵循重载规则;

(4)拷贝构造函数时对象正确初始化的重要保证;

(5)必要的时候,必须手工编写拷贝构造函数。


原创笔记,转载请注明出处!

更多精彩请关注微信公众号:依法编程

长按解锁

解锁更多精彩内幕

技术驱动生活


C++笔记018:构造函数的调用规则的更多相关文章

  1. [Effective JavaScript 笔记]第38条:在子类的构造函数中调用父类的构造函数

    示例 场景类 场景图(scene)是在可视化的过程中(如游戏或图形仿真场景)描述一个场景的对象集合.一个简单的场景包含了在该场景中的所有对象(称角色),以及所有角色的预加载图像数据集,还包含一个底层图 ...

  2. C++语言笔记系列之十三——派生类构造函数的调用

    1.派生类构造函数的调用 (1)一个基类的全部数据成员均被派生类继承.创建一个派生类对象时.系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间. (2)一个派生类对象在创建时不仅要调用派生类 ...

  3. [C#解惑] #1 在构造函数内调用虚方法

    谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...

  4. 关于在C#中构造函数中调用虚函数的问题

    在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...

  5. C++ 构造函数中调用虚函数

    我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { p ...

  6. C# 构造函数中调用虚方法的问题

    请看下面代码: using System; public class A{ public A(){ M1(); } public virtual void M1(){} } public class ...

  7. [C++基础]在构造函数内部调用构造函数

    看下面的面试题: #include <iostream> using namespace std; struct CLS { int m_i; CLS( int i ) : m_i(i){ ...

  8. 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)

    中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...

  9. 避免在构造函数中调用虚方法(Do not call overridable methods in constructors)

    CLR中说道,不要在构造函数中调用虚方法,原因是假如被实例化的类型重写了虚方法,就会执行派生类型对虚方法的实现.但在这个时候,尚未完成对继承层次结构中所有字段的初始化.所以,调用虚方法会导致不可预测的 ...

随机推荐

  1. java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)

    银行业务调度系统的项目需求:   模拟实现银行业务调度系统逻辑,具体需求如下:   Ø 银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口.   Ø 有三种对应类 ...

  2. android EventBus 3.0使用指南

    Enventbus的作用和好处我就不多说了,这里介绍下怎么使用. 2.+版本的使用方法 public void onEvent(MessageEvent event) { log(event.mess ...

  3. 11 OptionsMenu 菜单

    OptionsMenu 选项菜单(系统菜单 ) OptionsMenu:系统级别菜单 菜单的使用步骤: 1. res里的menu里添加布局 在布局里写菜单项 2. 在逻辑代码中使用OnCreateOp ...

  4. (NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在回到GameScene.m中,我们所有的碰撞处理就放在该类中 ...

  5. Android的oom详解

    Android的oom原因 1.资源对象没关闭造成的内存泄露,try catch finally中将资源回收放到finally语句可以有效避免OOM.资源性对象比如: 1-1,Cursor 1-2,调 ...

  6. Android开发技巧——PagerAdapter实现类的封装

    ViewPager是android的support库中的一个控件,也是一个在许多应用开发中都用得比较多的控件.目前为止,对ViewPager的使用,我一般是用ViewPager + Fragment的 ...

  7. C语言中的内存分配

    对于一个C语言程序而言,内存空间主要由以下几个部分组成: 1)程序代码区:用来存储程序的二进制代码 2)全局区/静态存储区 3)BSS段:用来存储未初始化的全局变量和静态变量. 4)栈区:存储局部变量 ...

  8. hive的数据导入与数据导出:(本地,云hdfs,hbase),列分隔符的设置,以及hdfs上传给pig如何处理

    hive表的数据源有四种: hbase hdfs 本地 其他hive表 而hive表本身有两种: 内部表和外部表. 而hbase的数据在hive中,可以建立对应的外部表(参看hive和hbase整合) ...

  9. 理解WebKit和Chromium: JavaScript引擎简介

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. 什么是JavaScript引擎 什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript ...

  10. 小强的HTML5移动开发之路(11)——链接,图片,表格,框架

    来自:http://blog.csdn.net/dawanganban/article/details/18098193 一.HTML是什么? HTML(hypertext mark-uplangua ...