摘要: 0. 类的成员函数函数原型定义了所有和函数相关的类型信息: 函数返回类型是什么、函数的名字、应该给这个函数传递什么类型的实参。类的成员函数,其原型必须在类中定义。但是,函数体则既可以在类中也可以在类外定义。以下是一个 Sales_item 类的定义。 1 class Sales_item { 2 // operations on Sales_item objects 3 public: 4 double avg_price() const; 5 bool same_isbn(const Sales_item &rhs) const 6 ... 阅读全文
posted @ 2013-05-07 17:27 HandsomeDragon 阅读(781) 评论(0) 推荐(0)
摘要: jni是java调用本地方法(c、c++写的),android 下用JNI需要.so文件,NDK就是能够方便快捷开发.so文件的工具。使用NDK的基本思路就是将本地代码(native code)编译成函数库,然后就可以在Java代码中使用它。(当java程序在虚拟机中执行时,当执行native的函数时,虚拟机的“native引擎”会根据包名、函数名和参数来决定调用哪个本地函数(c中函数),所以在调用本地函数之前,必须把C所生成的动态库装载到虚拟机,否则java中的native函数就会因找不到本地实现而报错。Native引擎中AndroidRuntime类提供了一个registerNativeM 阅读全文
posted @ 2013-04-07 11:44 HandsomeDragon 阅读(2786) 评论(0) 推荐(0)
摘要: 一、引用形参考虑下面不适宜复制实参的例子,该函数希望交换两个实参的值:1 // incorrect version of swap: The arguments are not changed!2 void swap(int v1, int v2)3 {4 int tmp = v2;5 v2 = v1; // assigns new value to local copy of the argument6 v1 = tmp;7 } // local objects ... 阅读全文
posted @ 2013-03-27 17:37 HandsomeDragon 阅读(323) 评论(0) 推荐(0)
摘要: throw, try, catch C++ 的异常处理中包括:throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw 引发了异常条件。try 块,错误处理部分使用它来处理异常。try 语句块以 try 关键字开始,并以一个或多个 catch 子句结束。在 try 块中执行的代码所抛出(throw)的异常,通常会被其中一个 catch 子句处理。由于它们“处理”异常,catch 子句也称为处理代码。由标准库定义的一组异常类,用来在 throw 和相应的 catch 之间传递有关的错误信息。系统通过 throw 表达式抛出异常。throw 表达式由关键字 th 阅读全文
posted @ 2013-03-25 10:38 HandsomeDragon 阅读(379) 评论(0) 推荐(0)
摘要: 标准 C++ 为了加强类型转换的可视性,引入命名的强制转换操作符,为程序员在必须使用强制转换时提供了更好的工具。命名的强制类型转换符号的一般形式如下: cast-name<type>(expression);其中 cast-name 为 static_cast、dynamic_cast、const_cast 和 reinterpret_cast 之一,type 为转换的目标类型,而 expression 则是被强制转换的值。强制转换的类型指定了在 expression 上执行某种特定类型的转换。dynamic_cast: 支持运行时识别指针或引用所指向的对象。const_cast: 阅读全文
posted @ 2013-03-22 13:29 HandsomeDragon 阅读(417) 评论(0) 推荐(0)
摘要: 毫无疑问,自增( ++ )和自减( -- )操作符为对象加1或减1操作提供了方便简短的实现方式。(编程中的宗旨“简洁即美”!)它们有前置和后置两种使用形式: int i = 0, j; j = ++i; // j = 1, i = 1: prefix yields incremented value j = i++; // j = 1, i = 2: postfix yields unincremented value因为前置操作返回加1后的值,所以返回对象本身,是左值。而后置操作返回的则是右值。( 巧记:“前前后后”—— 前置操作返回修改前的值,后置操作返回修改后的值 )。建议:优先使... 阅读全文
posted @ 2013-03-21 11:34 HandsomeDragon 阅读(223) 评论(0) 推荐(0)
摘要: 一、使用数组初始化 vector 对象不能用一个数组直接初始化另一数组,程序员只能创建新数组,然后显式地把源数组的元素逐个复制给新数组。这反映 C++ 允许使用数组初始化 vector 对象,尽管这种初始化形式起初看起来有点陌生。使用数组初始化 vector 对象,必须指出用于初始化式的第一个元素以及数组最后一个元素的下一位置的地址:1 const size_t arr_size = 6;2 int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};3 // ivec has 6 elements: each a copy of the co... 阅读全文
posted @ 2013-03-21 11:08 HandsomeDragon 阅读(234) 评论(0) 推荐(0)
摘要: 许多 C++ 程序在有标准类之前就已经存在了,因此既没有使用标准库类型 string 也没有使用 vector。而且,许多 C++ 程序为了兼容现存的 C 程序,也不能使用 C++ 标准库。因此,现代的 C++ 程序经常必须兼容使用数组和/或 C 风格字符串的代码,标准库提供了兼容处理。毫无疑问,当然可以用字符串字面值来初始化 string 类对象: string st3("Hello World"); // st3 holds Hello World通常,由于 C 风格字符串与字符串字面值具有相同的数据类型,而且都是以空字符 null 结束,因此可以把 C 风格字符串用在 阅读全文
posted @ 2013-03-20 16:23 HandsomeDragon 阅读(191) 评论(0) 推荐(0)
摘要: 引言数组类型的变量有三个重要的限制: 1)数组长度固定不变; 2)在编译时必须知道其长度; 3)数组只在定义它的块语句内存在。实际的程序往往不能忍受这样的限制——它们需要在运行时动态地分配数组。虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度。与数组变量不同,动态分配的数组将一直存在,直到程序显式释放它为止。每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap)。C 语言程序使用一对标准库函数 malloc 和 free 在自由存储区中分配存储空间,而 C++ 阅读全文
posted @ 2013-03-20 11:06 HandsomeDragon 阅读(875) 评论(0) 推荐(0)
摘要: 总述使用引用(reference)和指针(pointer)都可间接访问另一个值,但它们之间存在两个重要区别:(1)引用总是指向某个确定对象(事实上,引用就是该对象的别名、外号),定义引用时没有进行初始化会出现编译错误;(2)赋值行为上存在差异: 给引用赋值修改的是该引用所关联癿对象的值,而不是使该引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。 给指针赋值修改的是指针对象本身,也就是使该指针指向另一对象,指针在不同时刻可指向不同的对象(叧要保证类型匹配)。简单的举两个程序段作为例子。第一个程序段将一个指针赋给另一指针: 1 #in.. 阅读全文
posted @ 2013-03-18 15:47 HandsomeDragon 阅读(212) 评论(0) 推荐(0)