一、简介
本人主要是从事Android开发工作,熟练使用Java。现在项目需要用到C++,特此来记录学习过程,主要是记录C++相比Java的一些独特的点。
二、数据类型和变量
2.1 常见的数据类型
| 类型 | 位 | 范围 |
|---|---|---|
| char | 1 个字节 | -128 到 127 或者 0 到 255 |
| unsigned char | 1 个字节 | 0 到 255 |
| signed char | 1 个字节 | -128 到 127 |
| int | 4 个字节 | -2147483648 到 2147483647 |
| unsigned int | 4 个字节 | 0 到 4294967295 |
| signed int | 4 个字节 | -2147483648 到 2147483647 |
| short int | 2 个字节 | -32768 到 32767 |
| unsigned short int | 2 个字节 | 0 到 65,535 |
| signed short int | 2 个字节 | -32768 到 32767 |
| long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
| signed long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
| unsigned long int | 8 个字节 | 0 到 18,446,744,073,709,551,615 |
| float | 4 个字节 | 精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字) |
| double | 8 个字节 | 双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字) |
| long double | 16 个字节 | 长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。 |
| wchar_t | 2 或 4 个字节 | 1 个宽字符 |
强制转换
//格式
(type) expression
double a = 21.09399;
float b = 10.20;
int c ;
c = (int) a;
cout << "Line 1 - Value of (int)a is :" << c << endl ;
c = (int) b;
cout << "Line 2 - Value of (int)b is :" << c << endl ;
2.2 typedef声明
可以使用 typedef 为一个已有的类型取一个新的名字。
typedef type newname;
下面的语句会告诉编译器,feet 是 int 的另一个名称,并创建一个整型变量 distance。
typedef int feet;
feet distance;
2.3 枚举类型
C++中的枚举和Java的还是很像的,也会给每个枚举值一个value,默认从0开始
定义如下:
enum 枚举名 {
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数]
};
例子:
enum Color
{
red,
green,
blue
};
Color c = blue;
2.4 定义常量
- 使用 #define 预处理器。
- 使用 const 关键字。
#define identifier value
#define LENGTH 10
#define WIDTH 5
const type variable = value;
const int LENGTH = 10;
const int WIDTH = 5;
#define是宏定义, 是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换。
const 关键字和java中的constant差不多,都是用来定义常量,常量定义后不可修改。
2.5 函数
函数声明
函数声明会告诉编译器函数名称及如何调用函数, 当在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。
//函数声明包括以下几个部分:
return_type function_name( parameter list );
int max(int num1, int num2);
int max(int, int); //参数的名称并不重要,只有参数的类型是必需的
函数的参数默认值
当定义一个函数,可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。
int sum(int a, int b=20) {
int result;
result = a + b;
return (result);
}
2.6 指针和引用
因为在大学学过一些C,对指针的概念和使用还是记得的,毕竟比较重要,就是一个指向内存地址的变量,像Java里面的一个对象变量也是类似指针,存储的也是内存地址。这里主要说一下引用
引用
引用变量是一个别名,是某个已存在变量的另一个名字。例:
// 声明简单的变量
int i;
// 声明引用变量
int& r = i;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
r = 6;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
//得到结果
Value of i : 5
Value of i reference : 5
Value of i : 6
Value of i reference : 6
那么引用有什么作用呢?为啥要给一个已经存在的变量取另外一个名字?
引用通常用于函数参数列表和函数返回值。
#include <iostream>
using namespace std;
// 函数声明
void swap(int& x, int& y);
int main () {
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
/* 调用函数来交换值 */
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
}
void swap(int& x, int& y) {
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}
//执行结果
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100
可以看到swap函数可以直接改变main函数的局部变量,而在Java中都是值传递,无法实现这种传引用的方式。如果非要用Java实现上面的swap函数,只能变相实现,比如传一个int[2]。