C++ Primer 类 12.4 默认构造函数

转载 2016年05月30日 21:39:20

默认构造函数

默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参的构造函数。比如下面的类Test,它的默认构造函数就是Test()。

class Test
{
public:
    Test(){} // default constructor
} ;

如果你没有为你的类提供任何构造函数,那么编译器将自动为你生成一个默认的无参构造函数。一旦你为你的类定义了构造函数,哪怕只是一个,那么编译器将不再生成默认的构造函数。

为你的类提供默认的构造函数

有很多原因,列举如下:

1. 当你使用静态分配的数组,而数组元素类型是某个类的对象时,就要调用默认的构造函数,比如下面的代码。

Object buffer[10]; // call default constructor

2. 当你使用动态分配的数组,而数组元素类型是某个类的对象时,就要调用默认的构造函数,比如下面的代码,如果Object没有默认的构造函数,是无法通过编译的,因为new操作符要调用Object类的无参构造函数类初始化每个数组元素。

Object* buffer = new Object[10];

3. 当你使用标准库的容器时,如果容器内的元素类型是某个类的对象时,那么这个类就需要默认的构造函数,原因同上。

vector<Object> buffer;

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

复制代码
class B
{
    B(int i){}
};

class A
{
    A(){}
    B b;
};

int main(void) 
{ 
    A a(); // error C2512: 'B' : no appropriate default constructor available

    getchar() ; 
    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 ; 
} 
复制代码

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

C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)

1.构造函数: 构造函数是一个特殊的、与类同名的成员函数,用于给每个成员设置适当的初始值。 构造函数不能有返回值,函数名为类名。 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺...
  • scottly1
  • scottly1
  • 2014年06月09日 08:04
  • 1886

什么情况下C++编译器会生成默认的构造函数

问题:对c++初学者来说存在一个误区,如果类没有定义任何构造函数,编译器会自动生成默认的构造函数。   注意:这种说法是错误的。 正确的说法:惟有默认构造函数”被需要“的时候编译器才会合成默认构造...
  • zyl_1102179268
  • zyl_1102179268
  • 2017年03月05日 00:01
  • 646

C++ 默认构造函数的重要性

1、默认构造函数 C++ 默认构造函数是对类中的参数提供默认值的构造函数,一般情况下,是一个没有参数值的空函数,也可以提供一些的默认值的构造函数,如果用户没有定义构造函数,那么编译器会给类提供一个默...
  • apacat
  • apacat
  • 2016年06月12日 15:37
  • 445

C++类可以不显示声明构造函数,在创建类对象时编译器自动调用默认的构造函数

#include "stdafx.h" #include #include using namespace std; // 没有显示声明构造函数,编译器会调用默认的构造函数 class Te...
  • ameyume
  • ameyume
  • 2014年07月08日 00:13
  • 4217

C++ Primer笔记(十七)多重继承与虚继承

多重继承是从多于一个直接基类派生类的能力。多重继承的派生类继承其所有父类的属性。 为了支持多重继承,应扩充派生列表,多个类用逗号分割。如: class panda:public bear,publ...
  • woshibendangao
  • woshibendangao
  • 2014年04月27日 11:11
  • 975

C++ - 默认复制构造函数 执行 浅拷贝

默认复制构造函数 执行 浅拷贝 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23941807 C++, 会默认生成一个复...
  • u012515223
  • u012515223
  • 2014年04月17日 16:29
  • 3291

C++类的特殊成员-默认/拷贝/移动构造函数

详细讲解类的默认构造函数,拷贝/移动构造函数,以及拷贝赋值和移动赋值等操作。...
  • shenwanjiang111
  • shenwanjiang111
  • 2016年12月14日 22:46
  • 1567

C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数

默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数、析构函数与赋值函数 构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意, ...
  • twlkyao
  • twlkyao
  • 2013年06月16日 09:09
  • 13336

C++之带有默认参数值的构造函数

在一个类中 ,如果程序员没有写,任何一个构造函数,则编译器将为该类提供一个默认的构造函数,如果程序员对类的构造函数进行了重载,则编译器将不提供默构造函数,这里需要手动书写一个无参的构造函数, 无参的...
  • u012129719
  • u012129719
  • 2015年07月23日 14:57
  • 6024

c++ 没有默认构造函数类不能用作动态分配数组的元素

最近看《c++ Primer》
  • gty55044
  • gty55044
  • 2014年10月17日 20:59
  • 1230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Primer 类 12.4 默认构造函数
举报原因:
原因补充:

(最多只允许输入30个字)