大学刚毕业那会我因为专业的原因有一年多的C/C++ linux MFC方面的编程经验,后来被iOS系统所吸引,就转作iOS了,当时主要是被它绚丽,流畅的系统所吸引,还有一个原因当然是钱了,呵呵。最近打算学习一下ffmpeg,opengl,所以想再次拾起C/C++。语言其实都是相通的,尤其是做过,我想应该可以很快上手。学习能力是我们程序员的一个强项嘛,哈哈。个人觉得呢,任何一门语言或是一个方向,入门都是比较简单的,但是想深入做好都是需要下功夫的。不过相对而言,我觉得iOS编程想对C/C++还是简单很多。个人认为主要表象以下两点:
- 就语言本身而言:Objective-c 没有C++语言复杂,例如Objective-c是单继承的,C++是多继承的。Objective-c没有抽象类,C++有抽象类等。
- 就平台而言:Objective-c 主要运用于苹果相关平台(Macos watchos tvOS iOS),所以苹果提供了强大的系统库和各种牛逼的系统框架,以及很多应用层的牛逼的开源的第三方框架。所以用它来实现一个绚丽的功能非常简单,例如:动画。c++是一个跨平台的语言,可以运用于很多平台。但是它在所有平台都可以用的只有一些跟语言本身紧密结合的系统库,以及一些特殊领域的一些开源框架。如音视频领域的 opengl。
所以Objective-c 主要运用于苹果相关平台(Macos watchos tvOS iOS),编程相对比较简单,因为很多牛逼的功能苹果和很多业界大牛已经帮我们做好了。c++可以运用于很多平台,但是编程相对比较难,难在除了语言本身之外,还有就是许多的功能需要我们自己实现。
下面进入正题,来看看C++的一些基础知识吧。
我觉得任何一门语言,在语言本身的知识点上都有共性:如:变量类型,数据类型,变量的作用域,类型修饰符,运算符,字符串的处理等,还有面向对象语言的三大特性:封装,继承,多态。
下面我们就从这些知识点开始学习吧。
变量类型
bool : 存储值为true或false
char : 通常单个字节(一个字节)。这是一个整数类型
int : 整数是机器上最自然的存储尺寸大小
float : 单精度浮点值
double : 双精度浮点值
void : 表示空类型
wchar_t : 宽字符类型
C++也允许定义各种其他类型的变量,像枚举,指针,数组,引用,数据结构和类等;
作用域
- 局部变量:这是一个函数或块内声明的变量,它们只能由属于该函数或代码块内部的语句中使用。
- 全局变量:全局变量在所有函数外定义,通常在程序的顶部。全局变量将持有整个项目的生命期值。全局变量可以被任何函数访问。也就是说,全局变量可以在整个程序它的声明之后使用。
数组
c++中数组和Objective-c不一样,c++中数组中可以存基本类型也可以存对象(指针),但是数组中的对象必须是类型一致。Objective-c中只能存对象,但是可以存不同类型。
如:
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};
字符串
在任何语言中字符串处理都是很大,很常用的一块。
- C风格的字符串:
//声明并初始化
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";
操作:
strcpy(s1, s2); 复制字符串s2到字符串s1
strcat(s1, s2);连接字符串s2到字符串s1的末尾
strlen(s1); 返回字符串s1的长度
strcmp(s1, s2);返回值为0,s1和s2是相同的; 如果s1
s2 返回大于0
strchr(s1, ch);返回一个指针,指向字符串s1中第一次出现字符ch
strstr(s1, s2);返回一个指针,指向字符串s1中第一次出现的字符串s2
- C++的String类:
//声明并初始化
string str1 = "Hello";
string str2 = "World";
指针
指针是一个变量,其值是另一个变量的地址。就像变量或常量,必须声明一个指针,然后才能使用它。
//声明:
int *ip; // point to an integer
double *dp; // point to a double
float *fp; // point to a float
char *ch // point to character
//使用
#include
using namespace std;
int main ()
{
int var = 20; // actual variable declaration.
int *ip; // yiibaier variable
ip = &var; // store address of var in yiibaier variable
cout << "Value of var variable: ";
cout << var << endl;
// print the address stored in ip yiibaier variable
cout << "Address stored in ip variable: ";
cout << ip << endl;
// access the value at the address available in yiibaier
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
}
//结果
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20
在C++语言中有几个重要概念,我们后面博客中讨论:
Null 指针 C++中支持null指针,这是一个常数为零在几个标准库中定义的值
指针运算 有一些可以对指针使用四则运算符: ++, --, +, -
指针VS数组 有指针和数组之间有密切的关系。
指针数组 可以定义数组来存储一些数字的指针
指针的指针 C++可以让指针指向指针
传递函数指针 通过引用或地址传递参数均使传递的参数将在调用函数被调用函数改变
引用
c++中有个重要概念叫引用:
引用也就是别名,也就是为另一个已经存在的变量起了个别名。它与指针很相似但是又很不同:
- 不能有NULL引用。必须始终能够保证一个引用连接到一个合法的一块存储。
- 一旦引用被初始化为一个对象,它不能被改变为引用另一个对象。指针可以在任何时候指向另一个。
- 在创建时引用必须初始化。指针可以随时进行初始化。
//创建
int i = 17;
int& r = i;
//使用
#include
using namespace std;
int main ()
{
// declare simple variables
int i;
double d;
// declare reference variables
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0;
}
//结果
Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7
在C++中引用通常用于函数参数列表和函数返回值。
C++基本输入/输出
C++标准库提供一套广泛的输入/输出功能,我们先来看看最常见的I/O操作。
C++ 的I/O发生在流,这是字节序列。如果字节从设备流向如键盘,磁盘驱动器,或网络连接等,以主存储器,这就是所谓的输入操作,如果字节从主存储器流到设备等的显示屏幕,打印机,磁盘驱动器或网络连接等等,这就是所谓的输出操作。
- I/O库头文件:
此文件定义cin, cout, cerr 和 clog 对象,分别对应于标准输入流,标准输出流中,无缓冲标准错误流和缓冲标准错误流 该文件声明服务,所谓的参数化流操纵,如setw和setprecision进行格式化I/O 该文件声明服务用户控制文件处理。我们将详细的文件一下讨论和Stream相关章节
- 标准输出流 (cout):
预定义的对象cout是ostream的类的实例。该cout对象被说成是“连接到”标准输出设备,这通常是在显示屏幕上。 cout用于在结合流插入操作符,它被写成<< 。
//使用
#include
using namespace std;
int main( )
{
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
//结果
Value of str is : Hello C++
- 标准输入流 (cin):
预定义对象cin 是istream类的一个实例。cin对象被认为是连接到标准输入设备,这通常是键盘。cin用于与流提取运算符,它被写成>>。
//使用
#include
using namespace std;
int main( )
{
char name[50];
cout << "Please enter your name: ";
cin >> name;
cout << "Your name is: " << name << endl;
}
//结果
Please enter your name: cplusplus
Your name is: cplusplus
- 标准错误流(cerr):
预定义的对象cerr是ostream类的一个实例。cerr对象被认为是附着到标准错误设备,这也是一个显示屏幕,但是在对象cerr是无缓冲和每个流插入到cerr导致其输出立即显示。
cerr 也用于与该流的插入操作者一起作为显示在下面的例子。
//使用
#include
using namespace std;
int main( )
{
char str[] = "Unable to read....";
cerr << "Error message : " << str << endl;
}
//结果
Error message : Unable to read....
- 标准的日志流(clog):
预定义的对象clog是ostream 类的一个实例。clog对象被连接到标准错误设备,这也是一个显示屏幕,但是在对象clog被缓冲。这意味着,每个插入堵塞会导致其输出到在缓冲器被保持到缓冲区填满或直到缓冲器被刷新。
clog也被用于与此流的插入操作者一起作为显示在下面的例子。
//使用
#include
using namespace std;
int main( )
{
char str[] = "Unable to read....";
clog << "Error message : " << str << endl;
}
//结果
Error message : Unable to read....
以上只是个人的总结,可能有误,敬请各位大神指点,谢谢。
未完持续更新中待续。