参考文献:
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; }
结果: