美文网首页
C++ 基础(一)

C++ 基础(一)

作者: ZhengYaWei | 来源:发表于2019-03-07 21:35 被阅读0次

    目录

    前言

    自工作以来接触了 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_
    • 使用驼峰命名方式

    相关文章

      网友评论

          本文标题:C++ 基础(一)

          本文链接:https://www.haomeiwen.com/subject/metdjqtx.html