1. 程式人生 > >記錄:50多行程序中找出多寫的一個字母e

記錄:50多行程序中找出多寫的一個字母e

lan .net ont isp 快樂 sdn p s ora 調試

  小霍同學調程序,做的是第11周的項目1 - 存儲班長信息的學生類,可是她寫的程序(就在以下),呃,請讀者自己執行一下吧。(下午在機房調試時用的是Code::Blocks10.05。輸出的是非常長的莫名的符號,晚上在家用的是CodeBlocks12.11,典型的內存溢出癥狀。)

#include <iostream>
#include <string>
using namespace std;
class Stu   //聲明基類
{
public:
    Stu(int n, string nam ):num(n),name(nam) {} //基類構造函數
    void display( );          //成員函數,輸出基類數據成員
protected:        //(*)訪問權限為保護型的數據成員[不能被外界引用但能夠被派生類引用]
    int num;      //學生學號
    string name;  //學生姓名
};
void Stu::display( )          //成員函數,輸出基類數據成員
{
    cout<<"學號:"<<num<<endl;
    cout<<"姓名:"<<name<<endl;
}
class StuDetail: public Stu              //聲明派生類StuDetail
{
public:
    //學生nam。學號n。a歲,家住ad。他的班長是nam1。學號n1
    StuDetail(int n, string nam,int a, string ad,int n1, string nam1); //派生類構造函數
    void show( ); //成員函數,輸出學生的信息
    void show_monitor( );    //成員函數。輸出班長信息
private:
    Stu monitor;   //學生所在班的班長。班長是學生。是Stu類的成員
    int age;       //學生年齡
    string addr;   //學生的住址
};
StuDetail::StuDetail(int n, string nam,int a, string ad,int n1, string nam1):Stu(n,name),monitor(n1,nam1)
{
    age=a;
    addr=ad;
}
void StuDetail::show( ) //成員函數,輸出學生的信息
{
    cout<<"學生信息:"<<endl;
    cout<<"學號:"<<num<<endl;
    cout<<"姓名:"<<name<<endl;
    cout<<"年齡:"<<age<<endl;
    cout<<"住址:"<<addr<<endl;
}
void StuDetail::show_monitor( )   //成員函數,輸出班長信息
{
    cout<<"班長信息:"<<endl;
    monitor.display();
}
int main( )
{
    //學生王力,10010號,19歲,家住上海的北京路,他的班長是李孫。學號10001
    StuDetail s(10010,"Wang-li",19,"115 Beijing Road,Shanghai",10001,"Li-sun");
    s.show( );                       //輸出學生信息
    s.show_monitor();                //輸出班長信息
    return 0;
}
  老賀及時來幫忙,單步執行是法寶。

  在機房調試時用的是Code::Blocks10.05,51行定義並初始化對象s沒有問題。順利通過,而在52行s.show(),輸出了莫名的文字。

  再次單步,step into到s.show()中,發現混亂來自於39行輸出name的地方。非常自然,name的值有問題。

name值是通過構造函數獲取的,須要找源頭。

問題出在39行,但思維必須得跳出show函數,找到真正的罪犯。

  昏花的老眼看30行的構造函數,一眼就看出了冒號後面對基類構造函數的調用Stu(n,name)有蹊蹺:形式參數中聲明的是(int n, string nam, ...),而實際參數怎麽就出來了(n,name)。去年一個字母e。構造函數的調用該為Stu(n,nam)。

編譯再執行,小霍緊鎖的眉頭放開了。剛才還在怨著計算機的她,應該在反思著自己的大意了。
  為何會這樣?錯誤的調用,實際上在用未經初始化的基類成員name作實參,那初始化的結果,name成員仍然是那個“野對象”。

string是C++中添加的類。當中的字符符串實際也是用指針實現的。未經初始化的對象,當中就有野指針。


  寫博文時用的是Code::Blocks12.11,單步執行時,51行的構造函數就下不去。焦點仍然能夠鎖定在派生類的構造函數上。問題仍能解決。

  編程序,練的就是這番功力。




=================== 迂者 賀利堅 CSDN博客專欄=================
|== IT學子成長指導專欄 專欄文章的分類文件夾(不定期更新) ==|
|== C++ 課堂在線專欄  賀利堅課程教學鏈接(分課程年級) ==| |== 我寫的書——《逆襲大學——傳給IT學子的正能量》    ==| ===== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =====



記錄:50多行程序中找出多寫的一個字母e