C/C++/Java 哪些值不是头等程序对象 在程序语言学中把相当于数学对象的程序对象叫做头等对象,因为它们作为运算对象的权利未受到任何限制。程 序对象的权限具体说来是: 可作为操作数出现在表达式中求值。 可作为单独的存储实体。 可作为参数传递到过程或函数。 可作为函数返回值。 可以构成复杂的数据结构。 函数抽象(即函数名)不能作函数返回值。 数组元素(单个,如a[3])不是可存储体,也不能作为函数返回值。 变量引用(如&j)不能在表达式中求值。 类和结构体的抽象(类名)不是头等程序对象,但具体的实例是头等程序组对象。
C/C++/Java 哪些机制采用的是动态束定 动态束定又叫动态联编,是指联编在程序运行时动态地进行,根据当时的情况来确定调用哪个 同名函数。动态联编对成员函数的选择是基于对象的类型,针对不同的对象类型将做出不同的编译 结果。 C++ 继承 通过基类指针指向子类型的对象并调用虚函数来实现 Java 继承(普通类和抽象类)、接口 通过继承中超类对象引用变量引用子类对象来实现 通过接口类型变量引用实现接口的类的对象来实现 C 没有
C++ 动态束定 - 继承 class A { public: virtual void f() {cout<<"A"<<endl;} }; class B : public A{ virtual void f() {cout<<"B"<<endl;} void main(){ A* p = NULL; A a; B b; p = &a; p->f(); // A p = &b; p->f(); // B }
Java 动态束定 - 继承 class A { void f() { System.out.println(“This is A”); } class B extends A { System.out.println(“This is B”); class Main{ public static void main(String[] args) { A a = new A(); B b = new B(); a.f(); // This is A a=b; a.f(); // This is B }
Java 动态束定 – 接口 interface A { void f(); } class B implements A { public void f() { System.out.println(“This is B”); class C implements A { System.out.println(“This is C”); class Main { public static void main(String[] args) { A a; a= new B(); a.f(); // This is B a = new C(); a.f(); // This is C }
比较分析C/C++和Java的参数传递机制,以及它们各自的优缺点 按值传递:void f(int x) : f(var) 实参和形参各自占有独立的存储单元,调用时将实参的值拷贝给形参,在被调用的函数执行时,访问 的是形参单元,函数调用结束后形参所占据的存储空间就被系统收回了。 按地址传递: void f(int* x) : f(&var) 按指针传递,它将一个变量的地址传送给调用函数的形参,在函数中可以改变实参。 按引用传递:void f(int& x) : f(var) 通过引用进行参数传递,效果与传递指针一样,但不必申请额外的空间。形参相当于实参的别名, 改变形参的值实际就是改变实参的值。
比较分析C和Java的参数传递机制,以及它们各自的优缺点 按值传递基本数据类型 和C++一样,针对基本数据类型以及String。 按值传递复合数据类型(原理类似于C/C++的按地址传递) 主要是针对复合数据类型,它传递的是一个对象句柄的拷贝,在函数中可以改变变量的值。 优缺点: C/C++中的指针(按地址传递)可以毫无约束地操作内存中的东西,功能强大但危险。 对于基本数据类型,Java不能在函数中对基本数据类型进行修改操作,会增加不便;对于复合数据类型, Java只能传递对象的引用,在函数中会对对象产生影响。 而C/C++对于对于基本数据类型和复合数据类型,既可以传递引用,又可以传递对象的拷贝(按值传递), 更加灵活。