C++拾遗
今天的所谓培训总算讲到了一些我有点兴趣的东西了,很明显C和Java中有非常多不同的地方,既然有一些收获,就把今天碰到的一些情况记录下来做个整理。很高兴的,我终于对C/C++(抱歉 我始终觉得C++跟C差不多 就多了点支持 多了OO的东西)的指针或是其本身不再那么排斥了,甚至觉得手动控制内存是件非常有趣的事,当然目前还只限于兴趣,让我自己写还是有很多问题的。
●继承中的虚函数virtual
Shape父类以及Circle子类的情况
在C++中
class Shape{
public:
void display(printf("I'm shape."););
};
class Circle : public Shape{
public:
void display(printf("I'm circle."););
}
这种情况下 如果创建一个实例:
Shape *shape = new Circle;
shape->display();
将会得到输出结果: I'm shape.
作为主要在跟Java打交道的我来看这个问题,就会觉得难以理解,同样的情况在Java中
class Shape{
void display(){System.out.println("I'm shape.");}
}
class Circle extends Shape{
void display(){System.out.println("I'm circle.");}
}
当构件一个实例:
Shape shape = new Circle();
shape.display();
得到的输出结果就是: I'm circle.
Java中子类的方法直接就覆盖掉了父类的方法,而C/C++中我被告知说,由于shape是Shape类型的指针,因此他在处理过程中,调用的依旧是shape中的display方法
暂且,就这么理解吧,那应该怎么做才能让C/C++中得到同Java一样的结果呢,其实也很简单,加入virtual
class Shape{
public:
virtual void display(printf("I'm shape."););
};
class Circle : public Shape{
public:
virtual void display(printf("I'm circle."););
}
这样当我们同样运行上面的程序时,输出结果就变成了我想要的 I'm circle. 原因同样据称是因为声明了virtual虚函数,因此编译器会找到具体的circle中display方法。
好吧 套用现在当下的话:It just happened. 我也只是记下了这么个情况 至于深层原理 希望知道的能再给我详细解释。
同时我又想了另外个问题,Java中存在覆写后的子类调用父类方法的情况吗,需要怎么做呢?
至少,我没想出来,能想到的只是再写一个superDisplay方法,调用super.display();
●关于指针对象
第二个问题,也是C/C++中指针带给我的困扰之一,如果继续用上面的类来举例的话,就是
Shape *shape=new Shape; 和 Shape shape; 两者有什么区别
目前暂时搞明白的是 C++中创建对象都需要new来操作 而new出来的对象即是指针对象 并且这个对象的生命周期是需要你手动进行控制的 他被分配在Heap中
而对于Shape shape所创建的,相当于一个global全局变量的概念 他被存储在Stack中 并由系统自动处理销毁时间(比如 一个以function为周期)
用今天老大画的图来说,C在运行时自低到高内存中分别是code,data,stack,heap,这些空间其实都是有限的
因此如果在一个递归的函数中创建了global概念的对象 即将对象存放在Stack中 当反复调用后 就会有可能造成Stack的溢出
再一个对于指针对象 *shape被new出后是需要进行手动销毁的(delete) 否则,当*shape指向的对象被清理后 就造成了一直听说的所谓内存泄露
顺带提到的 类似于malloc申请的空间,其实就是在heap中
虽然C/C++的内存管理需要程序员手动去操作,但就像老大那天说的,Java中如果你释放掉一个空间,再要立即申请一个空间,可能就会申请不到,因为这是Java自己gc管理的,但是C中,你可以命令系统释放,并将这个空间马上重新分配给自己使用,个人觉得,C/C++更接近底层,变得更加效率也是这方面的原因,至少是原因之一吧。(总之Java C#对程序员友好,C/C++更接近底层)
吐个槽,Java7就这么出来了,是不是又要去学习其中提供的新特性了呢,据犀牛说,他学习C#3.0 4.0的新特性 花了2个月时间。。如今他所说到的什么lambda,闭包,Linq,完全听不懂啊。。。(Java7依旧没支持闭包呢)
●关于C中的位运算操作应用
第三个问题,关于C中的位操作,老大说C写多了就会发现,很多时候都在&啊|的,还好我数字逻辑学的还行,看到一片10各种运算还不算太头疼
问题是这么引申出来的,就是判断FindFirstFile得到的文件是否是一个文件夹
被函数传回的是一个结构体,其中就包含了文件的属性,是一个16进制数,而对于判断,就是将这个16进制数进行比较
对于这个16进制数,每一位都有其特殊含义,比如隐藏,文件夹,只读等等 那么只读文件夹就是某2位为1,隐藏只读文件夹就是某3位为1
情况就是这样
在对比的时候就会称为attribute & DIRECTORY != 0之类的表达式
当要检验多种属性时 attribute & ( DIRECTORY | READONLY ) 等等
分享到:
相关推荐
在MFC开发环境中,当运行退出了,Visual STudio会在输出窗口提示是否有内存泄漏。也可以借助MFC类CMemoryState动态地检测并输出内存泄漏信息。 在非MFC框架中,需要借助CRT函数实现这些功能。...
首先,我们看到一个关于"第十一章 流程控制拾遗与混合训练"的文件。流程控制是程序设计中的核心部分,它包括条件语句(如if-else)、开关语句(switch)、循环(for, while, do-while)以及跳转语句(break, ...
Cpp-learning-notes C++拾遗 On the way to be a good cpp programmer. 项目地址 仓库: 在线阅读: 声明:这里所有内容是自己学习C++所遇问题的总结,不敢保证无错。如发现错误,欢迎指正。 本作品采用进行许可。
在MFC开发环境中,当运行退出了,Visual Studio会在输出窗口提示是否有内存泄漏。也可以借助MFC类CMemoryState动态地检测并输出内存泄漏信息。 在非MFC框架中,需要借助CRT函数实现这些功能。...
在本章拾遗中,我们将探讨C语言中的一些高级特性,包括结构体成员函数、C语言中的布尔类型、预编译指令与条件编译以及位运算与位段结构。这些内容是C语言深入学习的重要部分。 首先,让我们关注结构体成员函数。在...
在本项目中,"Visual C++ 简易网络五子棋游戏的实现" 是一个基于MFC(Microsoft Foundation Classes)框架开发的简单版在线五子棋游戏。MFC是微软提供的一套C++库,用于构建Windows应用程序,它封装了许多Windows ...
在开发过程中,需要注意以下几点:首先,在 MDK 中,C 文件要添加头文件,路径在工程选项卡中 C/C++ 中的 include path。其次,关键资料包括数据手册、参考手册、标准外设库等。最后,在编写代码时,需要注意头文件...
路径在工程选项卡中C/C++有include path。 2. 关键资料:数据手册、参考手册、标准外设库(包括固件库使用手册即函数功能描述)。 3. .C文件放置代码,对应的头文件都是声明:变量声明(宏定义),函数声明,类声明...
2. **编程语言和框架**:可能涉及到主流编程语言(如Java、C++、Python)的基本语法和特性,以及常用的开发框架(如Spring、Django等)的应用。 3. **数据结构与算法**:理解并应用基本的数据结构(如数组、链表、...