c++类和java类的一些区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/izzxacbbt/article/details/82954612

对象成员初始化:

两者的区别,有些比较老的书上介绍,c++不允许在类声明中初始化.

但是c++11已经允许在类声明中进行初始化了,这样在这一方面,java和c++就没有区别了.

传参方式:

首先两者的声明就不一样

在java中,创建一个类对象,一般是需要new一个东西出来,这是因为他使用一个对象的本质是指针类似.而在c++中,则只需要声明一下,就创建了一个类,如果在c++中用new,则是需要用类的指针接收.

这也就是说,如果我们在函数中用参数传递类,那么,c++是不能对类本身进行修改,而是对类的拷贝.而java则不同,他是传的指针,可以直接修改.

作用域:

作用域,前面说过,两者创建类的方法一般不同,用正常方法创建出来的c++类,他是个普通变量,所以,如果我们在另一个类A中有这样的成员变量类B,则在类A是不能够访问类B的私有成员C的,即使是用选择操作符B.C,而java中用默认的声明方法,我们是可以在类A中通过类B去访问类B的成员变量的,只要他们在一个包中,这样的话的确方便了许多.而结果也是失去了一定的封闭性.

函数重载:

c++中,同名的函数,派生类享有支配权,即,会优先调用派生类的同名函数,但是父类的函数也可以通过  父类::函数名  显式调用.也就是说并不会被覆盖,只是优先权的问题,而在java中,则不可以通过上面这种方法调用,但java可以在子类中新建一个不同名的函数,然后在这个函数中调用super中的函数,这样就可以避免父类的函数在子类中不可访问的问题.

静态成员的继承:

被声明为private的变量和函数都不可继承,这点在java和c++中是一样的,java更简单些,他的继承没有分为三类,但c++中需要注意的一点区别是,静态成员只要不是被声明为private的则在派生类中都可以访问,而不管声明的继承方式是private还是public.

另外补充一点,static变量在c++中仍旧不能在类声明中初始化.

 

多态性:

java中的多态实现方式有两种,一种是通过继承父类,然后重写父类中的同名函数,一种是通过实现接口中的函数,这两种方式都差不多,类似于给对象提供一个向外的接口,让外部可以调用.c++中的多态实现方式是通过虚函数来实现,通过声明基类中的方法为虚函数,然后用一个父类的指针或引用来达到在运行时根据不同的类调用不同的方法.c++中的虚函数,不管在派生类中的访问权限是什么,只要是通过虚函数接口调用,都是可以调用的(当然父类中的虚函数必须是public).

由于上面的内容需要详细展开,所以我在下面贴上代码.
 

#include <iostream>
using namespace std;
class Base
{
public:
	virtual void who()
	{
		cout << "base" << endl;
	}
};
class first_d :public Base
{
private :
	void who()
	{
		cout << "first derivation\n" << endl;
	}
};
class second_d :public first_d
{
private :
	void who()
	{
		cout << "second derivation\n" << endl;
	}
};
int main()
{
	Base* base;
	first_d fd;
	second_d sd;
	base = &fd;
	base->who();
	base = &sd;
	base->who();
	getchar();

	first_d* pfd;
	pfd = &fd;
	pfd->who();//error
        pfd = &sd;
        pfd->who();//error
	return 0;
}

这里有三个层次,首先最底层的base他的函数who是public的,所以用这个指针调用两个派生类fd和sd中的who函数是允许的,不用管在派生类中的访问权限是什么,相当于父类接口是允许访问的,然后通过这个接口去动态绑定子类的函数.

通过first_d类型的指针是不可以访问其who函数,同样也不可以访问派生类对象sd的who函数,因为在要求访问这个接口时候就被禁止了,所以不存在后面动态绑定的情况,即使在sd中将who函数声明为public也是一样.

另外,java中,子类同名函数覆盖父类的同名函数之后,在类外是不可以访问到父类被覆盖的同名函数的(但是可以通过新建一个函数然后super调用),而c++则可以通过加上父类名称显式调用.

猜你喜欢

转载自blog.csdn.net/izzxacbbt/article/details/82954612