目录
前言
自工作以来接触了 OC、Swift、RN、C 语言,简单的了解过H5 和 Python。OC 是一直在使用的语言,Swift 仅使用过三四个月,自学 RN 一个月,C 语言是在刚入行的时候才接触一点。RN 目前已完全忘记,Swift 仍然有一些记忆,再容易上手的语言没有经常巩固使用也可能忘记。Swift 语言之所以比 RN 印象深刻,可能在于三点:使用时间比 RN 长、用于实际开发、之前在简书中做过一些笔记。打算写两篇简单文章,更多的是作为个人笔记。
笔者也深深的认同:编程语言只是一门工具,重要的在于理解它的思想以及原理,并能应用到实际中。虽说各种编程语言只是一种工具,但并不意味着掌握了一门语言就无需再去了解其他语言,学习不同语言的优秀思想,能提供不同的编程思维视角,在自己所熟悉的领域中加以应用,可增加对编程的理解,站在更高的维度去思考代码。另外,很多语言都有共通之处,但某些语言可能更加接近底层,能加深对一些通用性原理知识的理解,比如 C++ 的面向过程和面向对象。
一、C++ 介绍
C++ 有四十年左右的历史,很多流行语言的根源都是 C++,比如Java、Python 等,包括 iOS 开发人员熟悉的Swift 语言,其中半数是通过 C++ 编写的,OC 中的 Runtime 源码也是包含了 C++ 和 C。C++ 应用的领域很广泛游戏(Cocos2d-x)、图像(OpenGL)、数据库、浏览器、搜索引擎、操作系统甚至包括编译器 GCC 和 LLVM 以及 Android 开发中的图片加载框架 fresco 都能看到 C++ 的身影。C++ 之所以应用如此广泛,主要在于其高效性和跨平台性。
一门优秀的语言不可能总是一成不变的,C++ 多年来不断的按照标准规范升级,不断发展和完善自身。以下是C++的各种版本。
Year | C++ Standard | Informal name |
---|---|---|
1998 | ISO/IEC 14882:1998[23] | C++98 |
2003 | ISO/IEC 14882:2003[24] | C++03 |
2011 | ISO/IEC 14882:2011[25] | C++11, C++0x |
2014 | ISO/IEC 14882:2014[26] | C++14, C++1y |
2017 | ISO/IEC 14882:2017[9] | C++17, C++1z |
2020 | to be determined | C++20[17] |
二、函数重载 overload
函数名相同,参数个数不同、参数类型不同、参数顺序不同。但是注意返回值类型与函数重载无关。之所以可以重载,是因为重载时会生成多个不同的函数名,不同编译器有不同的生成规则。
void test(long a){
cout << a << "float";
}
void test(int b){
cout << b << "int";
}
int main(int argc, const char * argv[]) {
test(3l);
test(2);
return 0;
}
三、C && C++
在C、C++混合开发时,C++在调用C语言,需要使用 extern "C" 修饰 C 语言的函数声明。注意 extern "C" 修饰 的 C 语言函数不能重载。
方式一:
//sum.h 文件
#ifdef __cplusplus
extern "C" {
#endif
int sum(int a, int b);
#ifdef __cplusplus
}
#endif
//sum.m 文件
#include "sum.h"
int sum(int a, int b){
return a + b;
}
方式二:
using namespace std;
extern "C" void test(long a);//声明
int main(int argc, const char * argv[]) {
test(1);
return 0;
}
void test(long a){//实现
cout << a << "float";
}
四、默认参数默认值
void test(int a = 3, int b = 4){
cout << "a is " << a << endl;
cout << "b is " << b << endl;
}
int main(int argc, const char * argv[]) {
test();
test(1);
test(1,2);
return 0;
}
五、内联函数
六、函数指针
void test1() {
cout << "test()" << endl;
}
void test(int a, void (*func)()) {
cout << "a is " << a << endl;
cout << "func is " << func << endl;
func();
}
int main(int argc, const char * argv[]) {
test(10,test1);
return 0;
}
七、pragma once
新建一个文件名为test.h
的头文件,内容如下:
#ifndef __TEST_H
#define __TEST_H
void test();
#endif
其中 #ifndef、#define、#endif 来防止头文件的内容被重复包含。借助 pragma once 也能实现类似效果。#ifndef、#define、#endif 受 C\C++ 标准的支持,不受编译器的任何限制。但有些编译器不支持 #pragma once, 且 #pragma once只能针对整个文件, #ifndef、#define、#endif 可以针对部分代码。
#pragma once
void test();
八、引用
C 中使用指针(Pointer)可以间接获取、修改某个变量的值,C++中,使用引用(Reference)可以起到跟指针类似的功能。
int age = 10;
//referenceAge是引用
int &referenceAge = age;
referenceAge = 30;
//数组的引用
int array[] = { 10, 20, 30 };
int (&rArray)[3] = array;
引用相当于是变量的别名,基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用,对引用做计算,就是对引用所指向的变量做计算。在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,非定义引用时使用&
,后续再使用&
表示取地址。引用就本质而言是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针。引用比指针更安全,因为引用不能像指针那样指向任意类型地址。
可以利用引用初始化另一个引用,相当于某个变量的多个别名。
int &rAge = age;
int &rAge1 = rAge;
int &rAge2 = rAge1
九、常引用
引用可以被const修饰,这样就无法通过引用修改数据了,称为常引用。
int age = 10;
const int &rAge = age;
rAge = 30;
常引用可以指向临时数据,如常量、表达式、函数返回值等。
//编译报错
int &rAge = 10;
//假设上一句代码编译可以通过,打开下面代码注释,相当于 50 = 10,此种情况很是怪异,所以第一行代码无法编译通过。
//rAge = 50;
上述代码实际是编译不过的。若想编译通过,需要在前面加上 const 。
const int &rAge = 10;
十、C++ 编程规范
- 全局变量: g_
- 成员变量: m_
- 静态变量: s_
- 常量: c_
- 使用驼峰命名方式