zoukankan      html  css  js  c++  java
  • 【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;
    }

    结果:

  • 相关阅读:
    每日vim插件--vim中的文本对象及相关插件
    《android传感器高级编程》译者序
    我在用的mac软件(3)-效率篇
    终端环境之tmux
    我在用的mac软件(2)-终端环境之zsh和z(*nix都适用)
    我在用的mac软件(1)--终端环境之iTerm2
    转:微服务架构的理论基础
    怎么使用阿里云直播服务应用到现在主流直播平台中
    WindowsServer2012显示计算机的方法
    在Windows Server 2012启用或关闭Internet Explorer增强的安全配置
  • 原文地址:https://www.cnblogs.com/dplearning/p/4783172.html
Copyright © 2011-2022 走看看