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

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


一、默认构造函数

两个特殊的构造函数

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. oracle中动态SQL详解

    部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...

  2. Java基础--Java---IO流------GUI(布局)、Frame、事件监听机制、窗体事件、Action事件、鼠标事件、对话框Dialog、键盘事件、菜单

     * 创建图形化界面  * 1.创建frame窗体  * 2.对窗体进行基本设置  *   比如大小.位置.布局  * 3.定义组件  * 4.将组件通过窗体的add方法添加到窗体  * 5.让窗体显 ...

  3. Git版本控制:Gitlab及Coding.net的使用

    http://blog.csdn.net/pipisorry/article/details/50709014 Gitlab介绍 GitLab是利用 Ruby on Rails 一个开源的版本管理系统 ...

  4. volatile实现可见性但不保证原子性

    volatile实现可见性但不保证原子性 volatile关键字: 能够保证volatile变量的可见性 不能保证volatile变量复合操作的原子性 volatile如何实现内存可见性: 深入来说: ...

  5. 关于Tomcat的URIEncoding以及GET乱码

    最近在维护着Linux上的服务器,当然,开发和前期测试是在windows上执行的. 在做意见反馈的时候,出现了windows上正常,Linux下却是乱码的问题. 先排查了web服务器与mysql的连接 ...

  6. pig基础知识总结

    Pig Latin UDF语句 REGISTER   在Pig运行时环境中注册一个JAR文件 DEFINE      为UDF.流式脚本或命令规范新建别名 Pig Latin命令类型 kill    ...

  7. html详解(二)

    4.多媒体标签 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  8. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  9. mpi中的广播

    MPI可以实现一对多的集合通信,最常用的是广播:某个进程将数据广播到所有其他进程,最终的结果就是每个进程都有一份广播的数据.MPICH中的广播函数是MPI_Bcast(void* buffer,int ...

  10. 《java入门第一季》之面向对象this关键字

    /* 起名字要做到见名知意. this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 注意:谁调用这个方法,在该方法内部的this就代表谁. this的场景: 解决局部变量隐藏成员变量 * ...