C++ 基础(一)

目录

前言

自工作以来接触了 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_
  • 使用驼峰命名方式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342