码迷,mamicode.com
首页 > 编程语言 > 详细

C++笔记018:构造函数的调用规则

时间:2018-05-03 16:31:56      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:padding   UNC   style   int   函数   形参   阶段   nbsp   names   

 


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

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


 

一、默认构造函数

两个特殊的构造函数

 

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:构造函数的调用规则

标签:padding   UNC   style   int   函数   形参   阶段   nbsp   names   

原文地址:https://www.cnblogs.com/tyyhmtyyhm/p/8985675.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!