【C++】默认构造函数

参考文献:

1.黄邦勇帅

2.http://www.cnblogs.com/graphics/archive/2012/10/02/2710340.html

3.http://blog.csdn.net/pnhuangyu/article/details/12352073

分三个部分:

  一、基础

  二、什么时候需要默认构造函数

  三、默认构造函数将成员初始化为了什么值

一、基础

  1.没有参数的构造函数是默认构造函数,默认构造函数只有一个。

  2.如果用户没有自己声明构造函数,C++将提供一个默认的构造函数。但是如果用户自己声明了构造函数,则C++不再提供默认构造函数。这时如果用户自己没有声明默认构造函数,在声明 A a;时会出错。

  3.当定义了默认构造函数时不要用语句 hyong a();来初始化对象 a, 因为这里编译器会把 a 理解为是一个反回类型为hyong 的函数,而不会初始化对象 a,正确语句应是 hyong a=hyong();

  4.只有一个参数的构造函数如 hyong (int a);可以用语句 hyong x=6 来调用构函数。

二、什么时候需要默认构造函数

  ①对象数组
  ②标准库的容器时,如果容器内的元素类型是某个类的对象时
  ③类中有另一个类的成员时
  ④类继承时

一个类A以另外某个类B的对象为成员时,如果A提供了无参构造函数,而B未提供,那么A则无法使用自己的无参构造函数。下面的代码将导致编译错误。

class B
{
public:
    B(int x){a = x;}
    int a;
};
class A
{
public:
    int a;
    B b;
};
int main()
{
    A ca;  //出错,因为B没有默认的构造函数
    return 0;
}

类A定义了拷贝构造函数,而没有提供默认的构造函数,B继承自A,所以B在初始化时要调用A的构造函数来初始化A,而A没有默认的构造函数,故产生编译错误。

class A
{
    A(const A&){}
};
class B : public A
{
    
};
int main(void) 
{ 
    B b; //error C2512:'B': no appropriate default constructor available
    getchar() ; 
    return 0 ; 
}

三、默认构造函数将成员初始化为了什么值

这主要取决于以下三点:

(1)      数据成员本身的类型;

(2)      生成的类对象的作用域范围(局部对象和全局对象);

(3)      特殊的static数据成员。 //这里先不讨论静态成员,之后在写一篇专门讲

对于类类型的变量,不管在全局作用域还是局部作用域,都调用其构造函数进行初始化。

对于内置、复合变量类型,如int, char *等,在局部作用域不初始化,在全局作用域会进行初始化,一般置为0.

例子:

#include "stdafx.h"
#include <string>
 
using namespacestd;
 
class Test
{
public:
         int a;
         bool b;
         char c;
         double d;
         string s;
};
 
Test t2;
 
int _tmain(intargc,_TCHAR*argv[])
{
         Test t;
         return 0;
}

结果:

原文地址:https://www.cnblogs.com/dplearning/p/4783172.html