引用:
https://www.cnblogs.com/gklovexixi/p/5814626.html(通俗易懂)
在创建对象时,很多的细节没有注意就会产生错误。归根到底还是基础不牢固。
图片引自:https://www.imooc.com/video/7636
默认构造函数与构造函数
class testClass
{
public:
testClass(); /* 默认构造函数 */
testClass(int a, char b); /* 构造函数 */
testClass(int a=10,char b='c'); /* 默认构造函数 */
private:
int m_a;
char m_b;
};
1. 默认构造函数主要是用来完成如下形式的初始化的:
testClass classA;
// 或者 testClass *classA = new testClass;
在这种情况下,如果没有提供默认构造函数,编译器会报错;
【默认构造函数是就默认执行构造的函数,说明这个函数 不需要 任何参数!无论是程序员给定了默认参数还是系统给定的参数。】
非默认构造函数在调用时接受参数,如以下形式:
testClass classA(12,'H');
//或者 testClass *classA = new testClass(12,'H');
2. 如果程序员没有定义任何构造函数,则编译器会自动定义默认构造函数,其形式如 testClass() {}; 可以看出,编译器自动提供的默认构造函数是 啥也没有啊 ;
3. 定义默认构造函数有两种方式,如代码展示的,一是定义一个无参的构造函数,二是定义所有参数都有默认值的构造函数 ;
class testClass
{
public:
testClass(); /* 默认构造函数 */
testClass(int a, char b); /* 构造函数 */
testClass(int a=10,char b='c'); /* 默认构造函数 */
private:
int m_a;
char m_b;
};
4. 注意:一个类只能有一个默认构造函数!也就是说两种方式不能同时出现,一般选择 testClass(); 这种形式的默认构造函数 ;
class testClass
{
public:
//不能同时出现!!!!
testClass(); /* 默认构造函数 */
testClass(int a=10,char b='c'); /* 默认构造函数 */
private:
int m_a;
char m_b;
};
5. 只要程序员定义了构造函数,编译器就不会再提供默认构造函数了,所以,程序猿最好再手动定义一个默认构造函数,以防出现 testClass a; 这样的错误。
class testClass
{
public:
testClass(int a, char b); /* 构造函数 */
//应加上此行
//testClass(); /* 默认构造函数 */
private:
int m_a;
char m_b;
};
void main()
{
testClass classA(12,'H'); //此行可编译通过
testClass class; //报错!因为没有默认构造函数!
}