一、关于声明和定义
在c++中一定要严格区分声明(不分配内存但在obj符号表中登记)和定义(分配内存)的区别,而在c#和java中我认为可以不用区分,就当没有声明这个概念,只有定义这个概念。原因是c++中的cpp文件都是要分别独立编译的,所以编译某个cpp时,是根本看不到其它cpp中有什么内容的,所以如果用到其它cpp中的符号(如变量),这些符号必须在这个要编译的cpp中声明,表示这个符号是“自己人”,只不过符号具体是什么内容以后链接时在其它cpp编译生成的obj文件中找。
二、关于引用
在c++中引用本质是个“常指针”,所以一定要在定义(分配内存)时初始化。在c#和java中引用本质是个“指针”,所以可以先定义,以后初始化。
c++中引用要用显示的“&”符号声明,而c#和java中不需要。
且在c++中类名就相当于一个变量名,如:Class A;语句中的A对象就相当于int a;语句中的a,A和a都是一个变量,代表一块内存。而在c#和java中,Class B;语句中的B是一个引用(指针),并不是一个变量,并不像int b;语句中的b,b直接代表变量所在内存的地址,而B直接代表的是指针的地址,它要拐个弯才能指向实际对象变量空间(当然实际写代码时不用想那么多)。
明白了上面所述区别后,看下面代码:string s1="abc"; string s2="def"; s1=s2;
在c++中,通过重载等号运算符,将s2中的内容复制到s1中,s1和s2代表的变量内存位置不变。
在c#和java中,会先丢弃s1指针所指的内存空间(垃圾回收自动执行),然后将s2引用的地址复制给s1引用,也就是s1和s2都存放了“abc”串所在空间的地址。
三、c++中的include;c++和c#中的using;java中的import
include就是把头文件内容原样复制到所在位置;using就是引入名字的复姓;import具有目录搜索(目前由于刚学习java,所以还不确定)和引入名字复姓两个功能。
重要的是,这三个语言都是怎么找到第三方写的类的(c++中找lib,c#找dll,java找class)。
c++中通过设置项目的“附加依赖项”或语句“pragma comment(lib,"..\\..\\ss.lib")”来把第三方写的代码加入到本项目中(就好像是自己写的cpp一样),但第三方的头文件中定义的各种符号的声明要通过include复制到需要的cpp中。编译某个cpp遇到不认识的符合在本cpp中的“符号表”中找。
c#中通过“添加引用”来把第三方dll库加入到自己所在的程序集中,以后要用到某个不认识的符合就到程序集中找。
java中(还不确定),直接通过import语句将对应目录下的或包的各种符号导入到程序集中(java中)
|