• 基本认识C++


    目录

    输入输出 & 命名空间使用

    缺省参数

    函数重载

    缺省函数的二义性

    关于为什么可以函数重载

    结束语


    hello world!

    输入输出 & 命名空间使用

    命名空间全部展开

    1. #include
    2. using namespace std; //在一般的学习使用中我们可以这样写
    3. //意思是把名为 std 里面定义的东西全部展开(库函数之类的)
    4. int main()
    5. {
    6. cout << "hello world!" << endl; //cout -- console cout(控制台输出)
    7. //endl -- end line(结束行、换行的意思)
    8. // << 流插入
    9. return 0;
    10. }

    注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中 

    相比C语言在C++中输出可以被自动识别类型

            可以看出在一些场合中C++的输出方式更加方便,但在一些情况下(比如控制打印浮点数后面几位小数,C++就比较麻烦),C++并没有C中的方便因此,遇到这种情形时可以结合这C的写法都是可以的。 哪个方便就用那个嘛。

    C++总结说明:
    1. 使用 cout 标准输出对象 ( 控制台 ) cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件以及按命名空间使用方法使用std
    2.cout cin 是全局的流对象, endl 是特殊的 C++ 符号,表示换行输出,他们都包含在包含 <
    iostream > 头文件中。
    3. <<是流插入运算符 >>是流提取运算符
    4. 使用 C++ 输入输出更方便,不需要像 printf/scanf 输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。
    5. 实际上 cout cin 分别是 ostream istream 类型的对象, >> << 也涉及运算符重载等知识,
    所以我们这里只是简单学习他们的使用。
            注意:早期标准库将所有功能在全局域中实现,声明在.h 后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,规定C++ 头文件不带 .h ;旧编译器 (vc 6.0) 中还支持 格式,后续编译器已不支持,因此推荐 使用 +std 的方式。

    命名空间直接展开使用

    下面一种方式同样也可以,并且相对上面的方式下面这种方式更安全,但是明显这样写会比较麻烦

    命名空间部分展开 

    推荐这种写法(不用全部展开 -- 但在一些日常学习与练习中,为方便可以直接全部展开)

    1. #include
    2. using std::cout;
    3. using std::endl;
    4. int main()
    5. {
    6. cout << "hello world!" << endl;
    7. return 0;
    8. }

    分步解析

    1.std -- 标准库(在C++中,把我们使用的库函数都封装在了一个命名空间之中 -- 就是std里面)

    std命名空间的使用惯例: 

    1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
    2. using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型 /
    / 函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
    大,就很容易出现。所以建议在项目开发中使用,像 std::cout 这样使用时指定命名空间 +
    using std::cout 展开常用的库对象 / 类型等方式。

            打个比方就是:命名空间就是一堵高墙把里面的东西都围起来了,外面的调用查找都看不到它,而using namespace std 就是把高墙拆掉了,但显然就失去了原先命名空间的作用

    2. :: -- 域使用,与命名空间相呼应

    1. //命名空间
    2. #include
    3. int a = 0;
    4. int main()
    5. {
    6. int a = 1;
    7. printf("%d\n", a); //这里用到就是局部变量a
    8. printf("%d\n", ::a); //这里用到的就是全局变量 -- :: 前为空白(什么都没有)
    9. return 0; //空白默认为全局域
    10. }

     

    命名空间

    3.1命名空间 -- 当程序代码不断的增多,难免会定义一个相同的变量(重定义),为避免这种情况的发生,C++中有了命名空间这一手段.

            在C/C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化 ,以避免命名冲突或名字污染 namespace 关键字的出现就是针对这种问题的。

    解析:这里函数名就是函数的地址,并且并没有使用定义的命名空间,所以打印出来的是地址(X64环境下)。还有一点要注意的是,在程序编译的过程中,会把头文件展开(所以rand可以向上被找到),但是在我没有指定使用命名空间的时候它并不会去里面找那个变量。

    ps:这些变量存放在静态区,是全局变量哦  原因:这里的变量不影响变量的生命周期

    3.2 -- 函数也可以放在命名空间中

             我们到现在就可以发现,其实基本上都可以放在命名空间里面,这样就可以很好的弥补C语言里面因为命名相同而产生的各种bug,方便了大型程序的开发。

            ps:还有一个需要注意的时,同名的同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 (.h文件在编译器编译的时候就会展开,相当于在同一个文件下)

     

    缺省参数

    缺省参数概念

            缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。

     

     

    缺省函数总结 

    1. 半缺省参数必须 从右往左依次 来给出,不能间隔着给
    2. 缺省参数不能在函数声明和定义中同时出现
    3. 缺省值必须是常量或者全局变量
    4. C 语言不支持(编译器不支持) 

    注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值

    解释:当一个函数声明在声明文件(通常在大型的程序中,声明与实现会分离)中,

     

    函数重载

            函数重载:是函数的一种特殊情况, C++ 允许在 同一作用域中 声明几个功能类似 的同名函数 ,这些同名函数的形参列表 ( 参数个数 或 类型 或 类型顺序 ) 不同 ,常用来处理实现功能类似数据类型不同的问题。

     

    缺省函数的二义性

    第一种情况  -- 无法区分

    1. //缺省函数的二义性
    2. #include
    3. using std::cout;
    4. using std::endl;
    5. void f()
    6. {
    7. cout << "f()" << endl;
    8. }
    9. void f(int a = 0, char b = 1)
    10. {
    11. cout << "f(int a, char b)" << endl;
    12. }
    13. int main()
    14. {
    15. f(1);
    16. f(1, 2);
    17. //f(); 在前面存在的前提下,直接调用f()会报错 -- 二义性
    18. return 0;
    19. }

    第二种情况 -- 参数顺序不同

     

     

    第三种情况  -- 返回值不同

     

     

    关于为什么可以函数重载

    采用 C 语言编译器编译后结果

     

    结论:linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。

    采用C++编译器编译后结果 

     

    结论: linux 下,采用 g++ 编译完成后,函数名字的修饰发生改变,编译器将函数参
    数类型信息添加到修改后的名字中。

            由此可知在C语言中这个是不被支持的,因为C语言中是直接使用地址找到函数的,并没有后面的一串转化。 

            C++中:函数名修饰规则 -- 参数不同,修饰出来的名字就不同了

     

    结束语

    岂曰无碑,以身立之面不倒,
    岂曰无碑,以躯立之面不逝,
    岂曰无碑,以墓立之终不归,
    岂曰无碑,以名立之永不朽。
    夫边上者,可倒,可逝,可不归,不可退。

  • 相关阅读:
    如何写得一手优雅规范的SpringBoot 接口?
    javascript导入excel文件
    2013年第四届丘成桐大学生数学竞赛获奖名单
    15. 机器学习——聚类
    ElasticSearch部署实战架构、容量规划优化
    再出发!中国数据存储产业在AI时代突围
    集合的使用
    Vue插槽
    JAVA计算机毕业设计校园互助系统(附源码、数据库)
    uniapp小程序监听标签距离顶部多少距离,返回顶部效果demo(整理)
  • 原文地址:https://blog.csdn.net/weixin_67595436/article/details/126866556