zoukankan      html  css  js  c++  java
  • 笔记:构造函数易错点

    本文介绍了类中无默认构造函数可能会出现的问题,以及避免方法。
    下面一段程序编译的时候 会出现错误.

     1 #include<iostream>
     2  
     3 #include"string.h"
     4 using namespace std;
     5 
     6 class Student
     7 {
     8     private:
     9     int Num,Chinese,Maths,English;
    10     float Total;
    11     char Name[20];
    12     public:
    13 //        Student(){}//默认构造函数 
    14          Student(char name[20],int num,int chinese,int maths,int english);
    15 
    16 };
    17 Student::Student(char name[20],int num,int chinese,int maths,int english){
    18     int n;
    19     for(n=0;n<strlen(name);n++)
    20         Name[n]=name[n];
    21     Num=num;
    22     Chinese=chinese;
    23     English=english;
    24     Maths=maths;
    25     Total=maths+chinese+english;
    26 }
    27  
    28 int main()
    29 {
    30     int i,j;
    31     int num,chinese,maths,english;
    32     char name[20];
    33     Student std[5];//此时编译不通过    
    34     
    35 }
    View Code

    错误信息如下:

     [Error] no matching function for call to 'Student::Student()'

    为了更好的说明这个错误出现的原因以及解决方案,下面先说明一下默认初始化的含义。

    默认初始化:定义的变量没有初始化的时候 编译器会自动为其初始化,这个过程叫做默认初始化,它由变量的类型和定义的位置决定。如果是全局变量的内置类型(int float...)则初始化为0,但是函数内的局部变量就不会初始化为0,所以在使用局部变量的时候需要注意。

    好了下面说说编译器对类是怎么默认初始化的:

    类的默认初始化由默认构造函数决定,即编译器会自动的调用默认构造函数进行初始化,(默认构造函数即:无须任何实参的构造函数) ,如果程序员没有显示的写一个构造函数,那么编译器会自动的隐式定义一个构造函数(合成的默认构造函数)。一个类的对象被定义的时候,会首先调用构造函数进行初始化(这是一些内置类型如int float...所没有的),除非你显示的调用初始化工作(就是你自己设计的构造函数),否则系统默认调用没有参数的构造函数,因为代码中没有定义无参数的构造函数,所以出现调用出错,就是编译出错的情况对应上面程序,当定义了构造函数以后,编译器合成的默认构造函数就不起作用了。所以Student类里边就没有默认的构造函数了

    即:没有没有参数的构造函数。所以Student std[5]; 此时系统调用默认构造函数 恰好此时没有了默认构造函数,就会出现错误。

    解决方案:可以在建立类的时候,除了建立了自己的构造函数外,要建立默认的构造函数。或者仅仅建立自己的构造函数,但是在定义变量的时候要注意初始化。

  • 相关阅读:
    [翻译] C++ STL容器参考手册 (总册)
    仿淘宝TAB切换搜索框
    超简单TAB切换
    程序员和项目经理驰骋职场的故事
    eclispse 闪退问题解决
    Jennic 之API学习
    JN5139 DIO中断机制
    HTTP Error503 .The service is unavailable
    纯CSS3动画:一棵跳舞的树
    【学习笔记】python 简单创建新建一个网络客户端,并返回相关的信息
  • 原文地址:https://www.cnblogs.com/newneul/p/7637324.html
Copyright © 2011-2022 走看看