C++笔记018:构造函数的调用规则
原创笔记,转载请注明出处!
点击【关注】,关注也是一种美德~
一、默认构造函数
两个特殊的构造函数
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:构造函数的调用规则的更多相关文章
- [Effective JavaScript 笔记]第38条:在子类的构造函数中调用父类的构造函数
示例 场景类 场景图(scene)是在可视化的过程中(如游戏或图形仿真场景)描述一个场景的对象集合.一个简单的场景包含了在该场景中的所有对象(称角色),以及所有角色的预加载图像数据集,还包含一个底层图 ...
- C++语言笔记系列之十三——派生类构造函数的调用
1.派生类构造函数的调用 (1)一个基类的全部数据成员均被派生类继承.创建一个派生类对象时.系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间. (2)一个派生类对象在创建时不仅要调用派生类 ...
- [C#解惑] #1 在构造函数内调用虚方法
谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...
- 关于在C#中构造函数中调用虚函数的问题
在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...
- C++ 构造函数中调用虚函数
我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { p ...
- C# 构造函数中调用虚方法的问题
请看下面代码: using System; public class A{ public A(){ M1(); } public virtual void M1(){} } public class ...
- [C++基础]在构造函数内部调用构造函数
看下面的面试题: #include <iostream> using namespace std; struct CLS { int m_i; CLS( int i ) : m_i(i){ ...
- 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...
- 避免在构造函数中调用虚方法(Do not call overridable methods in constructors)
CLR中说道,不要在构造函数中调用虚方法,原因是假如被实例化的类型重写了虚方法,就会执行派生类型对虚方法的实现.但在这个时候,尚未完成对继承层次结构中所有字段的初始化.所以,调用虚方法会导致不可预测的 ...
随机推荐
- 内存管理单元--MMU
现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持,本节简要介绍M ...
- Tomcat集群如何同步会话
Tocmat集群中最重要的交换信息就是会话消息,对某个tomcat实例某会话做的更改要同步到集群其他tomcat实例的该会话对象,这样才能保证集群所有实例的会话数据一致.在tribes组件的基础上完成 ...
- HMM:隐马尔科夫模型-前向算法
http://blog.csdn.net/pipisorry/article/details/50722376 目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算 ...
- python类:属性
http://blog.csdn.net/pipisorry/article/details/50708616 Python 中的 property 属性 Python中有个很赞的概念,叫做prope ...
- Git版本控制:Git高级教程
http://blog.csdn.net/pipisorry/article/details/50669350 Git有很多命令行参数,使用起来非常方便.可以运行 man git log ,来看一下这 ...
- JSP连接MySQL时出现--错误:Access denied for user 'root'@'localhost' (using password: YES)'解决方案
用代码进行用户验证的时候总是出现这个错误,翻译一下,应该是root用户的是权限的问题没有放开. 那就想办法解决一下吧,具体的来说可以有这样的几种方式. 解决方法,首先想到的是先重启一下MySQL服务吧 ...
- UNIX环境高级编程——信号说明列表
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGK ...
- windbg分析运行在64位环境下的32位程序的dump
windbg命令如下 1. .load wow64exts 2. !sw 3. ~* kvnf
- UIView、UIViewLayout UI_01
1.首先:在UI里面我们使用的是MRC,需要把ARC改成NO: 若学习比较吃力,可以先学习一下基础: http://blog.sina.com.cn/s/blog_814ecfa90102vuzg.h ...
- 认识一下Android 事件分发机制
1.引子 由于android是采用分层布局(可以想象成PS时的图层概念一样),这样才可以在有限大小的手机屏幕上完成一些复杂的操作.当手指点击屏幕开始,这些动作在各层之间如何传递?就引出了Android ...