C++拾遗

 

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 ) 等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值