一段有关c++构造函数的程序

来源:互联网  责任编辑:小易  时间:2017/5/28 12:42:38
本网有用户碰到这样的问题:一段有关c++构造函数的程序,具体问题如下:

c++ 构造函数 文件流

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

=================1楼=====================

fin>>AllBook; // 读取文件中的数据,解析为一个int数,如果文件流没有出错,就相当于给AllBook 赋值
for(int i=0; i<AllBook; i++)

=================2楼=====================

引用 1 楼 jianwen0529 的回复:
fin>>AllBook; // 读取文件中的数据,解析为一个int数,如果文件流没有出错,就相当于给AllBook 赋值
for(int i=0; i<AllBook; i++)
但完整的程序中并没有AllBook啊,也就是磁盘文件中没有这个数据。

=================3楼=====================

book.txt
==============
磁盘应该有这个文件。

=================4楼=====================

引用 2 楼 hhhlizhao 的回复:
Quote: 引用 1 楼 jianwen0529 的回复:

fin>>AllBook; // 读取文件中的数据,解析为一个int数,如果文件流没有出错,就相当于给AllBook 赋值
for(int i=0; i<AllBook; i++)
但完整的程序中并没有AllBook啊,也就是磁盘文件中没有这个数据。


是读取程序当前目录下 book.txt 文件,然后读取文件里面的第一个数据
如果文件不存在,那你判断流的时候就应该是失败的
if(fin) //false

=================5楼=====================

引用 2 楼 hhhlizhao 的回复:
Quote: 引用 1 楼 jianwen0529 的回复:

fin>>AllBook; // 读取文件中的数据,解析为一个int数,如果文件流没有出错,就相当于给AllBook 赋值
for(int i=0; i<AllBook; i++)
但完整的程序中并没有AllBook啊,也就是磁盘文件中没有这个数据。


再有,你搞错逻辑了,是数据赋值给你的变量 AllBook

=================6楼=====================

引用 4 楼 jianwen0529 的回复:
Quote: 引用 2 楼 hhhlizhao 的回复:

Quote: 引用 1 楼 jianwen0529 的回复:

fin>>AllBook; // 读取文件中的数据,解析为一个int数,如果文件流没有出错,就相当于给AllBook 赋值
for(int i=0; i<AllBook; i++)
但完整的程序中并没有AllBook啊,也就是磁盘文件中没有这个数据。


是读取程序当前目录下 book.txt 文件,然后读取文件里面的第一个数据
如果文件不存在,那你判断流的时候就应该是失败的
if(fin) //false
boot.txt文件是存在的,但AllBook这个数据在程序中从头找到尾都没有找到,会不会是作者写错了?

=================7楼=====================

引用 3 楼 yshuise 的回复:
book.txt
==============
磁盘应该有这个文件。
book.txt文件有,但AllBook这个变量程序中只在这个函数中出现了,而且没有初始化,不知道它是什么意思啊!

=================8楼=====================

引用 6 楼 hhhlizhao 的回复:
Quote: 引用 4 楼 jianwen0529 的回复:

Quote: 引用 2 楼 hhhlizhao 的回复:

Quote: 引用 1 楼 jianwen0529 的回复:

fin>>AllBook; // 读取文件中的数据,解析为一个int数,如果文件流没有出错,就相当于给AllBook 赋值
for(int i=0; i<AllBook; i++)
但完整的程序中并没有AllBook啊,也就是磁盘文件中没有这个数据。


是读取程序当前目录下 book.txt 文件,然后读取文件里面的第一个数据
如果文件不存在,那你判断流的时候就应该是失败的
if(fin) //false
boot.txt文件是存在的,但AllBook这个数据在程序中从头找到尾都没有找到,会不会是作者写错了?

Library::Library() 
{
    borrownum=0;
    returnnum=0;
    int AllBook,AllStudent; //那你这个定义是什么?
    ifstream fin("book.txt"); //以输入方式打开磁盘文件book.txt(输入方式即从磁盘向显示器输出)
    if(fin)

=================9楼=====================

引用 8 楼 jianwen0529 的回复:
Quote: 引用 6 楼 hhhlizhao 的回复:

Quote: 引用 4 楼 jianwen0529 的回复:

Quote: 引用 2 楼 hhhlizhao 的回复:

Quote: 引用 1 楼 jianwen0529 的回复:

fin>>AllBook; // 读取文件中的数据,解析为一个int数,如果文件流没有出错,就相当于给AllBook 赋值
for(int i=0; i<AllBook; i++)
但完整的程序中并没有AllBook啊,也就是磁盘文件中没有这个数据。


是读取程序当前目录下 book.txt 文件,然后读取文件里面的第一个数据
如果文件不存在,那你判断流的时候就应该是失败的
if(fin) //false
boot.txt文件是存在的,但AllBook这个数据在程序中从头找到尾都没有找到,会不会是作者写错了?

Library::Library() 
{
    borrownum=0;
    returnnum=0;
    int AllBook,AllStudent; //那你这个定义是什么?
    ifstream fin("book.txt"); //以输入方式打开磁盘文件book.txt(输入方式即从磁盘向显示器输出)
    if(fin)
有AllBook的定义,但没有初始化啊!  for(int i=0; i<AllBook; i++)这段应该怎么解释?

=================10楼=====================

有AllBook的定义,但没有初始化啊!  for(int i=0; i<AllBook; i++)这段应该怎么解释?
我猜你脑袋肯定短路了
我举个简单例子吧
int n = 10; //定义并初始化

int j; //定义一个变量,但是没有初始化
j = 10;
for (int i = 0; i < j; i++)
{
}
然后你觉得我j现在不能用吗

fin>>AllBook; 就相对于读取一个数据给AllBook赋值
跟上面的 j = 10; 没有任何本质上的区别

=================11楼=====================

引用 10 楼 jianwen0529 的回复:
有AllBook的定义,但没有初始化啊!  for(int i=0; i<AllBook; i++)这段应该怎么解释?
我猜你脑袋肯定短路了
我举个简单例子吧
int n = 10; //定义并初始化

int j; //定义一个变量,但是没有初始化
j = 10;
for (int i = 0; i < j; i++)
{
}
然后你觉得我j现在不能用吗

fin>>AllBook; 就相对于读取一个数据给AllBook赋值
跟上面的 j = 10; 没有任何本质上的区别
fin>>AllBook是从磁盘文件book.txt读入数据到显示器啊,但我的book.txt中并没有AllBook,不知道这个参数指的什么啊?

=================12楼=====================

引用 11 楼 hhhlizhao的回复:
Quote: 引用 10 楼 jianwen0529 的回复:
有AllBook的定义,但没有初始化啊!  for(int i=0; i<AllBook; i++)这段应该怎么解释?

我猜你脑袋肯定短路了
我举个简单例子吧
int n = 10; //定义并初始化

int j; //定义一个变量,但是没有初始化
j = 10;
for (int i = 0; i < j; i++)
{
}
然后你觉得我j现在不能用吗

fin>>AllBook; 就相对于读取一个数据给AllBook赋值
跟上面的 j = 10; 没有任何本质上的区别
fin>>AllBook是从磁盘文件book.txt读入数据到显示器啊,但我的book.txt中并没有AllBook,不知道这个参数指的什么啊?
你赢了,你成功的感动了我!!

=================13楼=====================

就比如你文件内有个字符串 10
你也不用管具体怎么读的了,然后文件流把这个字符串10解析为int类型赋值给你的变量

=================14楼=====================

即使没有进行初始化,由于它是局部变量,编译器也会对他进行一个默认的赋值,只是不可控而已

=================15楼=====================

引用 13 楼 jianwen0529 的回复:
就比如你文件内有个字符串 10
你也不用管具体怎么读的了,然后文件流把这个字符串10解析为int类型赋值给你的变量
我明白你的意思了,但如果我的文件内有两个字符串,一个10,一个20,那文件流怎么知道该读哪一个呢?

=================16楼=====================

引用 15 楼 hhhlizhao 的回复:
Quote: 引用 13 楼 jianwen0529 的回复:

就比如你文件内有个字符串 10
你也不用管具体怎么读的了,然后文件流把这个字符串10解析为int类型赋值给你的变量
我明白你的意思了,但如果我的文件内有两个字符串,一个10,一个20,那文件流怎么知道该读哪一个呢?


你去学习下文件IO流吧

=================17楼=====================

文件指针在哪就从哪开始读,建议楼主去看下这方面的知识

=================18楼=====================

cin是开源的。

=================19楼=====================

ifstream也是开源的。

=================20楼=====================

引用 14 楼 u010095741 的回复:
即使没有进行初始化,由于它是局部变量,编译器也会对他进行一个默认的赋值,只是不可控而已


这位仁兄才说到重点啊!@jianwen0529

int a;
这句虽然你没‘显式’初始化,但运行期间系统会给它赋值,而这个值又是不确定未知的,变量不手动初始化这也是造成很多程序运行异常的一大原因

大学时第一次c语言上机课,用的vc6.0,按照书上的代码敲好之后打上断点运行调试,当单步到char buffer[16]时,看到局部变量栏中的buffer显式为“烫烫烫烫烫烫烫烫”,吓的我以为机器主办太热赶紧关机了

=================21楼=====================

下面这段程序中,AllBook和AllStudent,只是进行了声明,但没有初始化
---------------------------------
你先要搞清楚啥是声明,啥是定义!
显然,你的int AllBook,AllStudent; 这句是定义啊,或者叫“定义性声明”,是要开辟内存空间的!

变量的定义,你不手动初始化,系统会默认初始化,而对于c/c++来说,系统默认初始化时不可控未知的,不像oc语言等初始化可控

=================22楼=====================

引用 21 楼 lsq19871207 的回复:
下面这段程序中,AllBook和AllStudent,只是进行了声明,但没有初始化
---------------------------------
你先要搞清楚啥是声明,啥是定义!
显然,你的int AllBook,AllStudent; 这句是定义啊,或者叫“定义性声明”,是要开辟内存空间的!

变量的定义,你不手动初始化,系统会默认初始化,而对于c/c++来说,系统默认初始化时不可控未知的,不像oc语言等初始化可控
明白了,多谢兄台解答,还有一个问题,这个构造函数是什么时候执行的?刚开始"book.txt"中并没有数据,虽然AllBook会自动赋值,但其他数如tem.idnum应该不会,那么向temp容器中写入的那些数据都是空吗?

=================23楼=====================

这个(class)构造函数是什么时候执行的?
----------------------------------------------------
额,大哥,你c++基础不行啊,还没学会走就想跑了?学习这件事,“学费”还是要交的,不能好高骛远啊。。。。

类的构造函数是在类对象创建的时候执行的,构造函数中主要做类成员变量的初始化操作(主意,这里讲的初始化操作指的是手动初始化,你不手动初始化系统会默认初始化的——未知数);同样,类的析构函数在类对象销毁(回收内存)的时候执行,析构函数中主要做内存回收处理,尤其是堆成员变量,必须要手动delete的(当然,这个手动delete可以通过一些技术隐藏起来,比如智能指针)

举个例子吧:class A
类对象的创建:
1、堆创建:A a = new A(); 
2、栈创建:A a;
类对象的销毁:
1、堆销毁:delete a; 必须手动干预
2、栈销毁:栈上的对象由系统自动管理,即随着出栈操作会自动销毁,不需要我们手动做任何事情;这里面讲的出栈操作也是系统管理的,比较抽象:有出栈就必然有进栈,给你说个简单的情况就明白了:一个函数被调用,就是进栈,当该函数执行完就会被弹出栈

虽然AllBook会自动赋值,但其他数如tem.idnum应该不会,那么向temp容器中写入的那些数据都是空吗?
book tem;
fin>>tem.idnum
------------------------------------------------------------------------------------------------------------------------------------------
结合前面所讲的这一句:构造函数中主要做类成员变量的初始化操作(注意,这里讲的初始化操作指的是手动初始化,你不手动初始化系统会默认初始化的——未知数),你再仔细想一想?

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Coryright from @zhao4zhong1
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!

=================24楼=====================

理解讨论之前请先学会如何观察

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved