码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++基础特性


    前言
    1.C++很难学?——是的
    C++整体学习难度和Java整体学习难度是一样的
    不要想着精通C++。

    一、命名空间
    命名空间是为了防止冲突,有时候全局变量定义了好多,这时候会导致命名冲突,这时候的命名空间的作用就是给文件定了一个作用域,在这里就可以限定变量,函数的名称。

    1.什么是命名空间?
    命名空间就是namespace 后面跟的一串字符。这一串字符就叫做命名空间。命名空间的名字可以随便起。

    代码举例定义:
    命名空间里的变量a,和函数Add是独立的。和其他命名空间隔开的。

    namespace N1//N1就是命名空间
    {
    int a;
    int Add(int x, int y)
    {
    return x + y;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    二、C++输入输出
    C++的输入输出函数是cin和cout。从英语可以看出,in就是输入,out就是输出。cin输入就相当于C语言中的sancf,cout就相当于C语言中的输出。
    这两个函数学习起来成本有点高现在学了不一定能学懂,以后再说。

    三、缺省参数
    1.什么是缺省参数?
    缺省参数就相当于C语言中的形参可以赋初始值,也就是为形参指定了默认值。
    规则:如果没有实参穿过去,则使用该默认值。否则使用形参的值。

    2.全缺省参数
    全缺省就是全部形参都设置默认值

    void Print(int a = 10, int b = 20)
    {
    cout < cout << b << endl;
    }
    1
    2
    3
    4
    5
    3.半缺省参数
    半缺省参数是有的形参没有设置初始值。但是缺省只能从右往左缺省。

    void Print(int a, int b = 20)
    {
    cout <
    cout << b << endl;
    }
    1
    2
    3
    4
    5
    四、函数重载
    函数重载是什么?

    1.什么是函数重载?
    函数重载也是为了解决C语言的不便。假如需要调用Add加法的函数,如果没有函数重载的话就需要写不止一个Add函数。因为数有整数int,有浮点数float,有double类型的。这样就需要写三个版本的Add函数了。
    但是C++的函数重载解决了这个问题。你想要不同类型的任何的数字相加都可以。都可以实现调用Add这一个名字,而不需要写为其他名字。

    2.重载规定
    函数重载的这些同名函数必须 形参列表不同。形参列表不同指的是:形参顺序不同,形参类型不同,形参个数不同。

    五、重载原理
    1.为什么C语言不支持函数重载,而C++支持?
    不论是C/C++,都要经历,预处理,编译,汇编,链接。在编译的阶段,C语言会将函数名形成一个符号表,假如函数是Add(int x, double y);那么C语言形成的符号表里的函数名也是Add。但是C++他不一样呀,他为了弥补C语言这个小傻瓜的空白,在编译后形成的符号是:_ZAddid。格式是什么呢?格式是:_Z + 函数名 + 类型首字母,这就是C++支持函数重载的原因。

    这样我们就理解函数重载要求 参数不同,和返回值没关系。

    六、extern “C”
    extern C是在C++工程中想让代码按照C语言的方式编译,或者想调用C语言工程时所用的。函数前面加extern C 是高数编译器,该代码或者函数需要按照C语言的规则编译。

    七、引用
    引用就是取别名
    引用就是重用了C语言的取地址符号&。
    代码举例:

    #include
    using namespace std;
    int main()
    {
    int a = 10;
    int& b = a;
    return 0;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    b称为a的引用。
    引用格式:类型& 引用变量名 = 引用实体。

    1.引用特性
    1.引用在定义时必须初始化。
    2.引用只能引用一个实体。什么意思呢?意思就是b引用了a之后,就不能再引用其他变量了。

    2.常引用(重点)
    什么是常引用?
    在前面加了const修饰的就是常引用。
    常引用涉及到了权限放大缩小的问题。权限指的是变量的读和写。
    被const修饰的变量不能改变其值。所以只能读取。
    读就相当于你看书,写就相当于你在书上做笔记。

    代码举例:

    int main()
    {
    const int a = 10;
    //int& ra = a;错误,权限放大。因为a是只读的,而int是可以读写的。
    const int& ra = a;
    }
    1
    2
    3
    4
    5
    6
    3.引用做形参
    引用做形参就可以不用传指针了。
    这样就方便了我们写程序的效率。
    代码举例:
    这里的x和y是实参的引用。

    //交换函数
    void Swap(int& x, int& y)
    {
    int t = 0;
    t = x;
    x = y;
    y = t;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    4.引用作返回值
    引用可以做返回值。但是要注意:只有出了作用域,被返回的值没有销毁,才可以用引用做返回值。所以我们定义的变量必须是static修饰的或者是动态开辟的,或者是全局变量等不会随着函数调用的结束而销毁的变量。
    代码举例:

    int& Add(int a, int b)
    {
    static int c = a + b;
    return c;
    }
    1
    2
    3
    4
    5
    注意:如果函数返回时,出了函数作用域,返回对象未还给系统,则可以使用引用返回;如果已经还给系统了,则必须使用传值返回。

    八、内联函数
    1.什么是内联函数?
    以inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开。使用时只用在函数前面加上inline,但是inline只是一种建议,具体实现还是看编译器。

    2.内联函数特性
    1.函数会在调用的地方展开没有函数压栈的开销,内联函数的使用可以提升程序的运行效率。频繁调用的小函数建议定义成内联函数
    2.inline对于编译器只是一个建议,编译器会自动优化。
    3.inline不建议声明和定义分离,因为inline是在函数调用的地方展开,编译的时候不会给函数分配地址,所以会导致连接错误。

    auto关键字(C++11)
    1.什么是auto
    在C++11中,标准委员会赋予了auto全新的含义:auto不再是一个存储类型的指示符,而是作为一个新的类型指示符来指示编译器,auto生命的变量必须有编译器在编译使其推导而得。

    2.auto使用规则
    1.使用auto变量时必须初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型,编译器在编译期间会将auto替换为变量实际类型。

    代码举例

    #include
    using namespace std;
    double Fun()
    {
    return 3.14;
    }
    int main()
    {
    int a = 10;
    auto b = a;
    auto c = ‘A’;
    auto d =Fun();
    cout << typeid(b).name() << endl;
    cout << typeid©.name() << endl;
    cout << typeid(d).name() << endl;
    return 0;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    3.auto与指针引用结合起来使用
    用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时必须加&。

    #include
    using namespace std;
    int main()
    {
    int a = 10;
    auto b = &a;
    auto* c = &a;
    auto& d = a;
    cout << typeid(b).name() < cout << typeid©.name() < cout << typeid(d).name() < return 0;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    4.如何在同一行定义多个变量?
    在同一行声明多个变量时,这一行的变量必须是相同的类型,否则编译器会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

    int main()
    {
    auto a= 1, b = 2;
    auto c = 3, d = 4.0;
    return 0;
    }
    1
    2
    3
    4
    5
    6
    5. auto不能推导的场景
    1.auto不能作为函数的参数

    因为无法知道实参的类型

    void TestAuto(auto x)
    {

    }
    1
    2
    3
    4
    2.auto不能直接用来声明数组

    int main()
    {
    int a[] = {1,2,3};
    auto b[] = {4, 5, 6};
    return 0;
    }

    1
    2
    3
    4
    5
    6
    7
    九、基于范围的for循环(c++11)
    不同于平时的for循环。C++11引入了基于范围的for循环。
    概念:for循环后的括号由冒号分为两部分:前半部分是范围内用于迭代的变量,后半部分是表示被迭代的范围。

    代码举例

    int arr[] = { 1,2,3,4,5};
    //将数组元素的值都乘以2
    for(auto& e : arr)
    {
    e *= 2;
    }
    //打印数组中的所有元素
    for(auto e : arr)
    {
    cout << e << " ";
    }
    cout << endl;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    可以用continue来结束本次循环,也可以用break来跳出整个循环。

    1.范围for的使用条件
    1.for循环迭代的范围必须是确定的。
    对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
    2.迭代的对象要实现++和==的操作。
    以后再详细了解

    十、空指针nullptr(C++11)特性
    1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为关键字引入的。
    2.在C++11中,sizeof(nullptr)和sizeof((void*)0)所占字节数相同。
    3.为了提高代码的健壮性,在以后的代码中表示指针空值时最好使用nullptr。不建议用C语言中NULL。

  • 相关阅读:
    SQL与关系数据库基本操作
    NC65 如何设置现金流量明细查询的查询框中核算账簿可多选??
    C++:vector 定义,用法,作用,注意点
    React中的路由基础知识(一级路由),5版本的!!!
    PAT(Advanced Level) Practice(with python)——1066 Root of AVL Tree
    MDM主数据平台使用总结
    计组与操作系统
    logging java日志选择
    K8s自动化集群环境搭建
    零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程。
  • 原文地址:https://blog.csdn.net/m0_71905144/article/details/126143454
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号