头痛头痛之一:
java里面,本质上来说,一个类是一个程序员定义的类型,类是一种引用类型(reference type),这意味着该类类型的变量都可以引用该类的一个实例。从表面上,对象引用变量中似乎存放了一个对象,但事实上,它只是包含了对该对象的引用。严格来讲,对象引用变量和对象是不同的,对象(new Person()),对象引用变量(Person p)。但大多数情况下,这种差异是可以忽略的。因此,可以简单地说p是一个Person对象,而不用冗长地描述说,p是一个包含对Person对象引用的变量。-----java基础篇P278
所以,Person p; p.a = 2; 这样是不行的,因为这个时候p还没指向任何内存。是null
所以需要Person p = new Person();
相反,C++直接 Person p; 即可调用p.a = 2;
头痛头痛之二:
java里面的方法,
public void fuck(final StringBuilder str) { str.append("haha"); }
这样的final只是说,不能改变str,也就是str不能指向其他地方,还是可以修改它指向的内容的。比如上面是ok的,会修改的
但是C++
void fun(const char * str)
就已经表明,str的内容是不可变的,至于指向,本来就是值拷贝,改变了对我影响不到的。只是在函数中临时改变
再比如
void fun(char * const str) { str[0] = '0'; }
指针常量,表明这个指针是一个常量,不可以再改变指向了,但是这个时候还是可以修改它指向的那块内存的值的。
注意:这个时候那块内存需要存在,如果你的是char * str = "liuweiming",这样它一更改还是会报错的,因为不能更改字符串常量
字符串常量保存在代码区
所以很大的区别就是final string str,表明的和const char * str不同
void fun(char * const str) { str[0] = '0';}
头痛头痛之三、
java中的类,默认类型,也就是什么都不写,也不算private的,只是说明其是包私有而已,同个包的还是能访问。
C++/C#中的类,默认类型,是private的,就是什么都不写,就不能访问了。