为什么写这篇文章
本文算作是 《Android 音视频开发打怪升级》系列文章的“番外”篇,原本打算将本文的内容写在 《Android FFmpeg视频解码播放》 这篇文章中,因为要想学习 FFmpeg
相关知识,C++
的基础知识是必不可少的。
但是写着写着发现,篇幅还是太长了,加上有部分小伙伴对 C++
可能也比较熟悉,所以把此节独立成篇,更有利于不熟悉 C++
的小伙伴学习查看,熟悉的小伙伴也可以直接跳过。
C++
相对于 Java
还是有许多的不同之处,对于没有使用过 C++
的人来说,如果要学习 NDK
开发,C++
是第一道坎,必须要掌握。
本文通过对比的方式,把 C++
和 Java
之间最基础,也是最常使用知识的异同标记出来,方便大家学习。
当然了,本文只是重点对 C++
中最常用的,也是重点的知识进行讲解,如有时间,最好还是系统地学一下相关的基础知识。
本文你可以了解到
本文使用对比的方式,将
C++
与我们非常熟悉的Java
进行对比学习,介绍C++
与Java
使用的异同,帮助大家快速入门C++
。
一、 C++ 基本数据类型
C++ 提供了一下几种基础数据类型
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
同时,这些类型还可以被类型修饰符修饰,拓展出更多的数据类型:
类型修饰符 | 关键字 |
---|---|
有符号类型 | signed |
无符号类型 | unsigned |
短类型 | short |
长类型 | long |
其中 signed
和 unsigned
指定了数据是否有正负; short
和 long
主要指定了数据的内存大小。
由于不同的系统,同个数据类型所占用的内存大小也不一定是一样的,以下是典型值:
类型 | 内存大小 | 范围 |
---|---|---|
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 个字节 | -xxx 到 xxx |
signed long int | 8 个字节 | -xxx 到 xxx |
unsigned long int | 8 个字节 | -xxx 到 xxx |
float | 4 个字节 | -xxx 到 xxx |
double | 8 个字节 | -xxx 到 xxx |
long double | 16 个字节 | -xxx 到 xxx |
可以看到,
short
修饰符将原类型内存大小减小一半;
long
修饰符将原数据类型内存大小扩大一倍。
二、C++ 类
C++
是一门面向对象的语言,类是必不可少的。其类的定义与 Java
大同小异。
Java
类通常声明和定义通常都是在同一个文件 xxx.java
中。
而 C++
类的声明和定义通常是分开在两个不同的文件中,分别是 .h 头文件
和 .cpp 文件
定义一个类
一个 类的头文件
通常如下:
// A.h
class A
{
private: //私有属性
int a;
void f1();
protected: //子类可见
int b;
void f2(int i);
public: //公开属性
int c = 2;
int f3(int j);
A(int a, int b); // 构造函数
~A(); //析构函数
};
对应的类实现文件 A.cpp
如下:
// A.cpp
/**
* 实现构造函数
*/
A::A(int a, int b):
a(a),
b(b) {
}
// 等价于
/*
A::A(int a, int b) {
this.a = a;
this.b = b;
}
*/
/**
* 实现析构函数
*/
A::~A() {
}
/**
* 实现 f1 方法
*/
void A::f1() {
}
/**
* 实现 f2 方法
*/
void A::f2(int j) {
this.b = j
}
/**
* 实现 f3 方法
*/
int A::f3(int j) {
this.c = j
}
可以看到,.h
文件主要负责类成员变量和方法的声明; .cpp
文件主要负责成员变量和方法的定义。
但是,并非一定要按照这样的结构去实现类,你也可以在 .h
头文件中直接定义变量和方法。
比如:
// A.h
class A {
private:
int a = 1;
public:
void f1(int i) {
this.a = i;
}
}
C++ 类中几个特别的地方
1) 可见性 private、protected、public
这几个关键字和 Java
是一样的,只不过在 C++
中,通常不会对每个成员变量和方法进行可见性声明,而是将不同的可见性的变量和方法集中在一起,统一声明,具体见上面定义的类A。<