参考文献:

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 ;
}

类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 ;
}

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

这主要取决于以下三点:

(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;
}

结果:

【C++】默认构造函数的更多相关文章

  1. C++的默认构造函数与构造函数

    今天看书,忽然发现自己对默认构造函数/构造函数的理解很模糊,在实际项目中写类时,这些细节问题并没有涉及到.因此,就专门对着<C++ Primer Plus>将默认构造函数/构造函数这一块简 ...

  2. C++ 合成默认构造函数的真相

    对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数. 合成默认构造函数会初始化类中所有的数据成员. 第一个误解来自于我学习 ...

  3. C++中默认构造函数中数据成员的初始化

    构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据 ...

  4. [C++]默认构造函数

    默认构造函数(default constructor)就是在没有显示提供初始化式时调用的构造函数.它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义.若个定义某个类的变量时没有提供初始 ...

  5. 【C++对象模型】构造函数语意学之一 默认构造函数

    默认构造函数,如果程序员没有为类定义构造函数,那么编译器会在[需要的时候]为类合成一个构造函数,而[需要的时候]分为程序员需要的时候和编译器需要的时候,程序员需要的时候应该由程序员来做工作,编译器需要 ...

  6. C++关于编译器合成的默认构造函数

    有两个常见的误解: 1.任何类如果没有定义默认构造函数,就会被合成出一个来. 2.编译器合成的默认构造函数会显式地设定类内每一个数据成员的默认值. 对于第一个误解,并不是任何类在没有显式定义默认构造函 ...

  7. Swift—默认构造函数-备

    结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函 ...

  8. C++默认构造函数的一点说明

    大多数C++书籍都说在我们没有自己定义构造函数的时候,编译器会自动生成默认构造函数.其实这句话我一直也是 深信不疑.但是最近看了一些资料让我有了一点新的认识. 其实我觉得大多数C++书籍之所以这样描述 ...

  9. C++结构体:默认构造函数,复制构造函数,重载=运算符

    C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就 ...

  10. java中创建对象中使用默认构造函数的注意点

    public class Test3 {   private int n;   Test3() {      System.out.println("调用默认构造器");   }  ...

随机推荐

  1. 并查集——hdu1213(入门)

    传送门:How Many Tables 模板代入 判断几个连通分支 DFS亦可完成 [并查集] #include <iostream> #include <cstdio> #i ...

  2. 大数运算——hdu1042N!

    一.题目回顾 题目链接:N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!   ...

  3. SSH 项目中 使用websocket 实现网页聊天功能

    参考文章  :java使用websocket,并且获取HttpSession,源码分析    http://www.cnblogs.com/zhuxiaojie/p/6238826.html 1.在项 ...

  4. 一个flink作业的调优

    最近接手了一个flink作业,另外一个同事断断续续有的没的写了半年的,不着急,也一直没上线,最近突然要上线,扔给我,要调通上线. 现状是: 1.代码跑不动,资源给的不少,但是就是频繁反压. 2.che ...

  5. rpc通信模型

    1.client_stub是为了屏蔽客户端调用远程主机的对象,而在本地的一个对象存根,存根负责接受本地方法调用,并将其序列化,然后通过网络发送给服务端.

  6. Java IO 小结

    Java IO 的学习需要明白流设计的体系结构,这样才能在实际需要的时候,通过API文档查阅,快速实现功能.

  7. mplab c30 注册方法

    http://blog.csdn.net/q553716434/article/details/7459036 关键文件是: C:\Program Files\Microchip\MPLAB C30\ ...

  8. 【CF Round 434 A. k-rounding】

    Time limit per test1 second memory limit per test 256 megabytes input standard input output standard ...

  9. 【BZOJ 1070】[SCOI2007]修车 费用流

    就是拆个点限制一下(两点一排一大片),这道题让我注意到了限制这个重要的词.我们跑网络流跑出来的图都是有一定意义的,一般这个意义就对应了问题的一种方案,一般情况下跑一个不知道对不对的方案是相对容易的我们 ...

  10. Angular 表单验证 基础篇

    <div class="nav"> <h4>表单验证</h4> <form ng-app="myApp" name=& ...