Java程序员学习一天半C++的感想
大学期间,学了一学期的C语言,当然包括学习数据结构时,用的也是C语言。当时刚刚接触计算机,对于编程更是一无所知。上课学习学习,偶尔会照着 书上敲一下代码。大二下学期,就丢掉了不用了。最近由于工作的需要,要使用Java Native Interface,所以就学习了1天半的C++,对C++有了一点点的了解,写一下自己的理解。
一天半时间,也学不多少东西,我主要就搞明白了下面几个问题:
1)指针
这么多年了,还记得在C语言时,最难以理解的,应该属于指针了。还记得谭浩强的那本C语言书(书名是啥,真的忘了。不过作者谭浩强老师,绝大多 数的中国开发人员应该都知道的),前面大部分用的都是基本数据类型(也就是Java中的原生类型),后面一小部分突然讲起了指针,当时立马就 蒙 圈了。不过好在最后还是理解了指针,虽然后来又忘记了。
指针是什么?
指针是一个存放另外一个东西的地址的变量。指针是一个变量,把一个具有特殊作用的变量称为指针。它的特殊作用就是:存放另外一个东西的内存地址。也 就是说指针变量的值代表了一个地址,这个地址是另外一个东西的。那另外一个东西是什么呢?就是我们说的对象(或者实例)。在C++中,还为这个对象起了一 个别名:引用。
总结一下就是:指针变量指向一个对象(或者引用)。
*、 的使用
在声明语句中:
*表示声明的是指针, 表示引用。
这里说的声明语句,可以是变量声明,也可以是函数声明中。在函数声明中,返回值、函数名、参数都可以声明为指针。
在使用指针变量时,
(* 变量名)代表取对象。( 引用)代表取指针。
p- setAddress("Bei Jing, Hai Dian"); // 采用指针的方式赋值 (*p).setName("Fang JiNuo"); // 采用对象的方式赋值。 (*p).setAge(23); printf("show info:\n%s\n", (*p).toString()); delete p; p=NULL; } }
这个两个词八个字,不知道有多少人载了跟头,其实很好理解了。中国人说话,多以叙述的方式为主。这个两个词都是省略句,不过省略的是助词。
函数指针全名是:函数名是指针。
指针函数全名是:返回值是指针的函数。
这两个中,指针函数很容易理解了:
char * func(char[] p);这个函数就是一个指针函数。
函数指针,函数名是指针。指针也是变量,所以就可以理解为:函数名是变量。
下面是一个函数指针变量的声明:
typedef int (* func) (int x);
然后把这个变量作为另外一个函数的参数来使用:
typedef int (*func)(int arg); // 定义一个函数指针 /* 一个函数指针的实现 * funcImpl就可以作为func的值进行赋值。 int funcImpl(int arg){ return arg; * 声明一个函数,将函数指针作为函数call的参数 void call(func f){ for(int i=0; i 10; i++){ cout f(i) endl; } // 进行测试 int main(int argc, char* args[]) call(funcImpl);
程序执行结果是,打印出0到9。
这个函数指针与下面JavaScript的代码有同样的作用:
function funcImpl(int num){ return num; (function call(f){ if(f){ if(f instance Function){ for(int i=0; i 10; i++){ alert(f(i)); } } } })(funcImpl);
当然了与下面的Java代码代码也是一样的:
在C#中,它还有另外一个名字,delegate。
其实它们都是传说中的钩子函数callback。
2)头文件、#include
在大学时,没有写过头文件,也没有看过头文件。所以头文件对我来说,一直是个谜。不过在学习了Java、C#后,就自然而然的会将#include 头文件理解为import、using等。
那么头文件中,会写什么呢?
一般来说,会将声明(类中的字段、方法的声明)写在.h文件中,将方法的实现,写在cpp文件中。以此来达到接口与实现的分离。其他地方使用#include时,就只会看到.h文件中的声明,看不到具体的实现。
另外要说的是#include的两种方式。 例如#include xxxx.h 、#include “xxxx.h”。这两种方式,还是有区别的, 方式是先从系统目录下找.h文件,” ”则是先从用户目录下去找.h文件。有点类似于Java中ClassLoader了,默认采用委托加载,也可以使用子类优先方式进行加载。
创建实例与回收
在C语言中,声明一个变量,可以直接使用声明的方式、也可以使用molloc的方式。
在C++中,又加入了一种new的方式,这种方式的写法与Java中是一样的。
Molloc、new 分配内存后,返回值都是指针。且分配在内存中Heap区,不会自动释放,所以需要使用free、delete进行释放。
另外在使用feee、delete后,最好是将指针的值设置为NULL, 因为free、delete只是释放了对象占用的内存空间,而指针的值仍然是对象在被释放前占用空间的首地址。
这与Java是不同的,Java能够自动的进行回收。对象设置为null即可。Java中的回收机制是:采用分代回收算法对于不可达的对象进行回收。
list Menu* ::iterator iter=this- menulist- begin(); while(iter!=this- menulist- end()){ Menu* menu=*iter; cout m- toString() endl; iter++; }
这段代码,在编译时,是没有问题的,也就是说从写法来讲,没有错误的。但是在执行showList()时就会出现空指针异常。原因如下:
在fun()中,创建的m1在heap中,不会自动的释放,创建的m2,在stack中,会自动的释放,当fun执行完毕时m2对象实际已经不存在了。然后执行showList()时,变量到m2对象时,肯定空的了,list中存储的m2的指针,已经成为野指针了。
3)namespace
命名空间,在大多数语言中都有的。他们的作用都是为了区分。
//定义命名空间
namespace ns{
// your code
}
// 导入命名空间:
using namespace std;
// 使用命名空间:
std::xxxx
4)#define 、typedef
typeof 是为已有类型取别名。在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
#define是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
5)操作符重载
学习C#时,知道可以对已有操作符进行重组,也就是赋予操作法新的功能。但是在C#中,我们很少这么做。Java中虽然没有语言级别的支持,但是Java中字符串拼接使用的+,其实就可以看做是操作符的重载。
在了解到C++中有操作符重载后,哦,原来这一点,C#是借鉴C++的呀。另外C#中还保留了struct。说到struct,再提一点,struct完全可以理解为C语言中的类。
C++ 中则使用了大量的操作符重载。具体的怎么去定义操作符重载,用到的时候再说吧。
一天半时间,了解的东西真的不多,都是最基本的。虽然我也知道C++中的字符串拼接没有Java、JavaScript那么随意那么任性。但是这些不属于难点,所以我认为不需要再提了。
最后,开一个玩笑,不懂JavaScript的Java程序员不是一个好的C++程序员。不懂Java的JavaScript程序员也不是一个好的C++程序员。
作者:螺 丝 钉
来源:51CTO
C++ Primer Plus 第6版 读书笔记(2)第2章 开始学习 C++ C++是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的程序详细而全面地阐述了 C++的基本概念和技术,并专辟一章介绍了C++11新增的功能。
C++ STL学习之【反向迭代器】 适配器模式是 STL 中的重要组成部分,在上一篇文章中我们学习了 容器适配器 的相关知识,即 stack 与 queue,除了 容器适配器 外,还有 迭代器适配器,借助 迭代器适配器,可以轻松将各种容器中的普通迭代器转变为反向迭代器,这正是适配器的核心思想
C++ STL学习之【容器适配器】 适配器(配接器)是 STL 中的六大组件之一,扮演着轴承、转换器的角色,使得 STL 中组件的使用更为灵活,比如 栈和队列 就是属于适配器而非容器,以及神秘的反向迭代器也属于适配器
C++ STL学习之【vector的模拟实现】 vector 是 STL 中的容器之一,其使用方法类似于数据结构中的 顺序表,得益于范型编程和 C++ 特性的加持,vector 更强大、更全能;在模拟实现 vector 时,还需要注意许多细枝末节,否则就很容易造成重复析构及越界访问
C++ STL学习之【vector的使用】 vector 是表示可变大小数组的序列 容器,其使用的是一块 连续 的空间,因为是动态增长的数组,所以 vector 在空间不够时会扩容;vector 优点之一是支持 下标的随机访问,缺点也很明显,头插或中部插入效率很低,这和我们之前学过的 顺序表 性质很像,不过在结构设计上,两者是截然不同的
C++ STL学习之【string类的模拟实现】 string 本质上就是一个专注于存储字符的顺序表,使用起来很方便;但在模拟实现 string 时,有许多值得注意的点,下面就来看看 string 类是如何诞生的吧
C++ STL 学习之【string】 STL 是 C++ 的重要组成部分,由六大部分构成:伪函数、空间配置器、算法、容器、迭代器 和 配接器,其中各种各样的 容器 可以很好的辅助我们写程序,比如今天要介绍的 string,有了它之后,我们对字符串的操作就能变得行云流水
相关文章
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 编程语言理解1-c语言,c++,java和python这些语言有何区别?编译型编程语言编译语言,解释型编程语言解释型语言
- elasticsearch 安装(基于java运行环境)
- android jni C/C++ 层和java层 进程间共享数据
- 【jmeter】+Not able to find Java executable or version. Please check your Java installation
- 第四节:详细讲解Java中的类和面向对象思想
- JAVA里使用CKEditor和CKFinder的配置
- C/C++/Java代码 模式匹配、朴素的模式匹配算法、KMP算法模式匹配 数据结构【经典算法】详解
- 【Java】类和对象
- Java:使用synchronized和Lock对象获取对象锁
- Java注解
- C++、Java、Objective-C、Swift 二进制兼容测试
- 【华为OD机试真题 java、python、c++】优秀学员统计【2022 Q4 100分】(100%通过)
- 【华为OD机试真题 java、python、c++、JsNode】服务中心选址、服务器最佳位置【2022 Q4 200分】
- 【华为OD机试真题 java、python、c++】微服务的集成测试【2022 Q4 100分】
- 【华为OD机试真题 java、python、c++】统计匹配的二元组个数(100%通过+复盘思路)
- 【华为OD机试真题 java、python、c++】获得完美走位、完美走位(100%通过+复盘思路)
- 【华为OD机试真题 java、python、c++】静态扫描(100%通过+复盘思路)
- java socket解析和发送二进制报文工具(附java和C++转化问题)
- 从Java到C++——常量的使用规则
- C++调用Java的Jar包
- Java -- 单例模式
- C++ and Java template class and function 模板类和模板函数
- C++ 'dynamic_cast' and Java 'instanceof' 使用对比
- C++/C, Java学习资料
- the resource is not on the build path of a java project错误
- 编程语言拟人化:Java、C++、Python、Ruby、PHP、C#、JS!--隆重推荐转
- Java实现Opencv源码以及启动appium的两种方式
- Java NIO —— Selector(用于SocketChannel)