C++学习笔记一 —— 基本语法

178 阅读2分钟

一、简介

本人主要是从事Android开发工作,熟练使用Java。现在项目需要用到C++,特此来记录学习过程,主要是记录C++相比Java的一些独特的点。

二、数据类型和变量

2.1 常见的数据类型

类型范围
char1 个字节-128 到 127 或者 0 到 255
unsigned char1 个字节0 到 255
signed char1 个字节-128 到 127
int4 个字节-2147483648 到 2147483647
unsigned int4 个字节0 到 4294967295
signed int4 个字节-2147483648 到 2147483647
short int2 个字节-32768 到 32767
unsigned short int2 个字节0 到 65,535
signed short int2 个字节-32768 到 32767
long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int8 个字节0 到 18,446,744,073,709,551,615
float4 个字节精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
double8 个字节双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
long double16 个字节长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。
wchar_t2 或 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]。