小广告推广网站,wordpress打开xml-rpc,51个人网站,手机网站制作参考资料文献之前c#xff0c;最近java有点混乱#xff0c;总结一下#xff1a; 1.在写java程序的时候会发现#xff0c;假如你自己写了一个类class A{。。。}#xff0c;这个时候你要实例化#xff0c;必须new一个#xff1b;但是在c里面就不用#xff0c;c中你可以直接声明A a; 为… 之前c最近java有点混乱总结一下 1.在写java程序的时候会发现假如你自己写了一个类class A{。。。}这个时候你要实例化必须new一个但是在c里面就不用c中你可以直接声明A a; 为何 a.java里面所有变量都是引用除了基本类型引用就相当于一个指针因此你必须要new不然没法使用当然在c里面指针可以光声明扔在那里不new你用的时候还是要new的java编译器在安全方面做出了优化。 b.c里面A a这句运行时会自动调用默认构造函数给你构造一个出来这是一个实例对象不是引用A中的field是有值的不过这个值可能是一个你不想要的。 2.关于RTTI的实现机制java跟c是不同的但原理是一样的 a.java如果实现RTTI很简单java的每个类都生成一个class文件。比如现在有一个基类shape其子类有circlesquare等。有一个vector i在java中vector如果没有被泛型化可以放入任何object。这时你可以把circlesquare都放进去upcasting。取出来的时候需要downcasting回shape比如shapei[0]这时在java中会进行RTTI但是这种括号形式的造型在c中不会进行RTTI只会被强制转换为中类型。那RTTI如何进行呢因为每个类都是一个class被加载到内存中后字节码是不同的因此可以方便进行RTTI。 b.c中也有RTTI在dynamic_cast跟typeid中进行。很容易推测要进行RTTI就要需要知道类的信息在java中有Class类记录类型信息其实在c中也有type_info个人认为这两个东西本质上是一样的只是很少人用到。因此在c中RTTI的进行依据是type_info。 c.别的还木有看只看了dynamic_cast的运作原理dynamic_cast是类型转换upcast比较好理解但downcast这里如何操作的呢当类中存在虚函数时编译器就会在类的成员变量中添加一个指向虚函数表的vptr指针每一个class所关联的type_info object也经由virtual table被指出来通常这个type_info object放在表格的第一个slot。当我们进行dynamic_cast时编译器会帮我们进行语法检查。如果指针的静态类型和目标类型相同那么就什么事情都不做否则首先对指针进行调整使得它指向vftable并将其和调整之后的指针、调整的偏移量、静态类型以及目标类型传递给内部函数。其中最后一个参数指明转换的是指针还是引用。两者唯一的区别是如果转换失败前者返回NULL后者抛出bad_cast异常。 转载于:https://www.cnblogs.com/xiayou/p/4236841.html