小霍同学调程序,做的是第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的更多相关文章

  1. python3实现在二叉树中找出和为某一值的所有路径

    在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设 ...

  2. ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

    1061: 从三个数中找出最大的数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][We ...

  3. hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  4. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

    前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...

  5. 海量数据中找出前k大数(topk问题)

    海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...

  6. C语言:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。-使字符串的前导*号不得多于n个,若多余n个,则删除多余的*号,

    //fun函数:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动. #include <stdio.h> void fun( char * ...

  7. 如何在 Linux 中找出最近或今天被修改的文件

    1. 使用 ls 命令,只列出你的 home 文件夹中今天的文件. ls -al --time-style=+%D | grep `date +%D` 其中: -a- 列出所有文件,包括隐藏文件 -l ...

  8. MO拆分计划行程序中写入PRODUCTIONORDERS表数据出现重复导致报错(BUG)20180502

    错误提示:ORA-00001: 违反唯一约束条件 (ABPPMGR.C0248833319_6192)ORA-06512: 在 "STG.FP_MO_SPLIT", line 19 ...

  9. 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比

    算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}  要找出那些数相加等 ...

随机推荐

  1. 算法学习记录-图——最小生成树之Kruskal算法

    之前的Prim算法是基于顶点查找的算法,而Kruskal则是从边入手. 通俗的讲:就是希望通过 边的权值大小 来寻找最小生成树.(所有的边称为边集合,最小生成树形成的过程中的顶点集合称为W) 选取边集 ...

  2. go的相关用法

    1. have gone to和have been to的区别 have gone to和have been to的区别如下: 1.have gone to,第三人称时用 has gone to ha ...

  3. magic mouse 2 在Mac上灵敏度太低的解决办法

    1.打开终端 2.输入以下代码查看当前鼠标移动速度 defaults read -g com.apple.mouse.scaling 你会看到输出的是 “3”,这是初始速度 3.输入以下代码改变鼠标移 ...

  4. java 枚举类型的使用

    应用  http://blog.csdn.net/qq_27093465/article/details/52180865 原理 http://blog.csdn.net/javazejian/art ...

  5. loj2002 「SDOI2017」序列计数

    水题 #include <iostream> #include <cstring> #include <cstdio> using namespace std; t ...

  6. ubuntu 终端查看图片(eog)

    远程登陆服务器的话,是没有办法直接查看图片的,这时我们需要进入图片所在目录,然后通过终端命令查看图片. 想要查看图片,需要通过ssh -X登陆,然后在终端输入命令: eog 图片名

  7. acm之简单博弈 Nim Bash Wythoff

    前些日子我打算开了博弈基础,事后想进行总结下 一句话就是分析必胜或必败,异或为0. 以下内容来自转载: Nim游戏的概述: 还记得这个游戏吗?给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠 ...

  8. Android点击两次返回退出程序

    代码改变世界 Android点击两次返回退出程序 private long mExitTime; public boolean onKeyDown(int keyCode, KeyEvent even ...

  9. BZOJ 2179 FFT快速傅立叶 ——FFT

    [题目分析] 快速傅里叶变换用于高精度乘法. 其实本质就是循环卷积的计算,也就是多项式的乘法. 两次蝴蝶变换. 二进制取反化递归为迭代. 单位根的巧妙取值,是的复杂度成为了nlogn 范德蒙矩阵计算逆 ...

  10. MyEclipse6.5增加对Tomcat7的支持

    MyEclipse6.5增加对Tomcat7的支持 最近在研究Servlet3.0,它是JavaEE6.0规范中的一部分 而Servlet3.0对服务器是有要求的,比如Tomcat7+(而Tomcat ...