Chinaunix首页 | 论坛 | 博客
  • 博客访问: 80366
  • 博文数量: 10
  • 博客积分: 202
  • 博客等级: 入伍新兵
  • 技术积分: 221
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-12 20:03
个人简介

一枚老菜鸟 吐槽基地:http://xuxiake1981.blog.hexun.com/

文章分类
文章存档

2020年(1)

2017年(1)

2013年(3)

2012年(5)

分类: C/C++

2012-12-16 13:39:21

1.多态的处理不同
编译时多态:函数重载,在这点上java与c++应该没有什么不同;也有的人说重载不算多态,小伙伴们怎么看?
运行时多态:父类引用,指向子类对象;运行时解释器自动根据对象类型,调用子类 的相应方法。对于java,要想实现运行时多态,只需满足父类中也定义了相应方法,而不管该方法是否抽象;对于c++,父类中定义了相应方法且父类的相应 方法必须为virtual方法,运行时多态才会自动调用子类方法。函数重载就跟虚函数没关系了吧;运行时重载肯定是基于虚函数的.


2.初始化的处理不同

c++与java的另外一个不同,new 操作符:
C++中对象变量名即是对象本身,新建对象只需要CLASSA a;
java中对象的变量名是引用,新建对象需要new才行。 CLASSA a= new CLASSA();
java中的new 是新建对象所必须的,因为java中只有引用。
C++类中的成员对象,不需要在类中或类外进行显示的初始化动作,其会随着类对象的创建而自动初始化。
对于类的对象也是一个道理,其作为类外的变量的时候,定义与初始化是一体的,在其定义处即进行初始化了。在header文件中及类的定义处,可以仅仅作为声明来看。除此以外,凡是作为变量出现的地方,都是定义的地方即初始化了。

例如,
#include
using namespace std;
int test();
class smallcircle
{
public:
    smallcircle()
    {
        cout<<"smallcircle built"<     }
};
class circle
{
private:
    smallcircle smcl;
public:
    circle()
    {
       cout<<"对象创建!"<     }
};
int main()
{
    circle c;
    test();
    return 0;
}
int test()
{
    circle d;
    return 0;

}
c++中的new 运算符,用来为一个对象的指针创建对象。而且只有这种方式的对象创建,才需要delete;

回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间.

3.子类显式调用父类构造函数的方法不同


c++与java的另外一个不同,子类显式调用父类构造函数的方法:
c++中,
  1. class CB : public CA {  
  2. public:  
  3.     CB(int k) :CA(k) { }  
  4. }; 
java中: super();
析构函数,会先析构子函数再析构父函数
 
以下几点,是JAVA有而C++缺乏的特性
4.强大的反射机制和RTTI特性
这个特性是当前流行的J2EE framework的基础,如Spring,Hibernate,无不利用了Java强大的反射机制。
Java可以在运行期动态创建class,并且invoke某一个方法。

MyClass helper = (MyClass) Class.forName(className).newInstance();

5.内建对多线程的支持和synchronized关键字
C++标准本没有提供比如创建thread的方法,不过现在出现了boost::thread应该是将来的C++标准。Java中有synchronized这个关键字,这是一种很简单,安全的锁机制。多线程编程很重要,但是也很复杂。希望新的C++ 0x标准能支持。

synchronized void initConfig() {
    if (!loaded) {
      load();
      loaded = true;
    }
  }

6.匿名类
匿名类可以有效的减少类的数目,是一种很有用的语言特性

new Thread(new Runnable() {
              public void run() {
                downloader.download();
              }
            }).start();
上面是启动一个新的thread来执行下载任务

7.final关键字
final使得更有效的表达设计者不希望被继承的意图。Java里面的final不等于C++的const。final用于class前面表示class不希望被继承,用于成员函数之前表示不希望被覆盖。这对于类库的设计是很重要的。毕竟不是每个类都为被继承做好了准备。

8.构造函数可以互相调用
这个特性使得写构造函数更加方便

class Test
{
    public Test()
    {
          this(1);
    }
    public Test(int i)
    {
          this.i = i;
    }
    private int i;
}

9.package的概念
package不但有比C++ namespace更加强大避免冲突的功能,而且提供了一种更清晰的源代码结构。
比如java中
package com.cppblog.io.*; 
C++要实现这样的,必须 
namespace com 

   namespace cppblog 
   { 
       namespace io 
       { 
       } 
   } 


10finally关键字
finally使得exception设计更加完备.很遗憾,C++里面只有try catch,虽然可以通过一些方法来work around,但是毕竟不是很方便。

try{
    openConnection();
}
catch(ConnectionException e){
    e.printStackTrace();
}
finally{
    closeConnection();
}

阅读(2586) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~