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

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


一、默认构造函数

两个特殊的构造函数

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. Android必知必会-Fragment监听返回键事件

    如果移动端访问不佳,请尝试 Github版<–点击左侧 背景 项目要求用户注册成功后进入修改个人资料的页面,且不允许返回到上一个页面,资料修改完成后结束当前页面,进入APP主页. 由于是使用多个 ...

  2. EBS财务模块表结构

     gl_code_combinations:科目组合 字段名 含义 备注 code_combination_id 主键,科目编码ID,自动编号 segment1 分行代码 setgment2 是受 ...

  3. android文件混淆详解

    -injars  androidtest.jar[jar包所在地址]  -outjars  out[输出地址] -libraryjars    'D:\android-sdk-windows\plat ...

  4. 【java线程系列】java线程系列之java线程池详解

    一线程池的概念及为何需要线程池: 我们知道当我们自己创建一个线程时如果该线程执行完任务后就进入死亡状态,这样如果我们需要在次使用一个线程时得重新创建一个线程,但是线程的创建是要付出一定的代价的,如果在 ...

  5. SpriteBuilder中使用GUI界面快速搭建RPG游戏中的地图名显示动画

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在RPG游戏中我们在进入一个新的场景时,比如一个房间,一个村庄, ...

  6. Objc中触摸处理阻塞时消息派送的问题

    在游戏场景中添加了touchBegan的处理: -(void)touchBegan:(CCTouch *)touch withEvent:(CCTouchEvent *)event{ if ([sel ...

  7. ListView控件使用

    //ListView标头的代码创建方法. ColumnHeader title=new ColumnHeader(); //声明标头,并创建对象. title.Text="标头1名称&quo ...

  8. VS2010创建和调用动态链接库

    当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...

  9. android下在屏幕适配小总结

    为什么要屏幕适配?为此我就不说了,网上处理方法要么让你用几套不同分辨率的图片,要么写几套布局文件,要么就是在xml中写dip(这个还是可以的),前面两种感觉过程工作量太大了,由加载大图片的优化思想 同 ...

  10. Mybatis执行BatchExecutor(四)

    BatchExecutor:顾名思义就是进行批量操作,通过批量操作来提高性能 public class BatchExecutor extends BaseExecutor { public stat ...