• C++入门【c++】


    这篇文章我们来学习吹泡泡,有一次性几点学习内容:

    目录

    零、本节知识安排目的

    一、c++关键字

    二、命名空间

     2.1命名空间的定义

    2.2命名空间的使用

    2.2注意事项

    三、c++输入与输出

    四、缺省参数

    4.1缺省参数概念

    4.2缺省参数分类

    五、函数重载

    5.1函数重载概念

    5.2函数重载的几个类别

    5.2 c++支持函数重载的原理——名字修饰


    零、本节知识安排目的

    在学习c++前我们为什么要学习c语言,因为c++就是由几个大佬对c语言进行升级改进得来的,c++的根就是c,c++包容c的语法不过也有许多独创的语法,在c语言的基础上容纳了面对对象编程思想。并增加了许多有用的库,以及编程范式等。

    本章主要目的:

    1、补充c语言语法的不足

    2、为后续类的学习打下基础

    一、c++关键字

    c++有63个关键字,c语言有32个关键字

    二、命名空间

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

    总而言之,命名空间就是为了避免命名冲突。

    命名冲突:

     stdlib.h里面有一个rand函数,你编写的这个程序编译器就分不清你想要的是rand=10这个变量还是rand函数的返回值。

    所以c++提出了namespace来解决这个问题。

     2.1命名空间的定义

    定义命名空间,需要使用到namespace关键字,后面跟美国这命名空间的名字,然后接一对{}即可,{}中间即为命名空间成员。

    使用方法:

    1. namespace bit
    2. {
    3. int rand=10;
    4. int ADD(int left,int right)
    5. {
    6. return left+right;
    7. }
    8. struct Node
    9. {
    10. struct Node*next;
    11. int val;
    12. };
    13. }
    14. int main()
    15. {
    16. int a = 10, b = 10;
    17. printf("%d", bit::ADD(a,b));//域作用限定符
    18. return 0;
    19. }

    2.2命名空间的使用

    (1)加命名空间以及作用域限定符:

    1. int main()
    2. {
    3. priuntf("%d",N::a);
    4. return 0;
    5. }

    (2)使用using建某个命名空间某个变量引入:

    1. using N::b;
    2. int mian()
    3. {
    4. printf("%d",b);
    5. return 0;
    6. }

    (3)使用using namespace 命名空间:

    1. using namespace N;
    2. int main()
    3. {
    4. printf("%d",b);
    5. return 0;
    6. }

     我们用到的using namespace std的语法依据就是源自于此,为了避免coder定义的变量和函数与库函数冲突,改良c的大佬就把所有库函数封装在命名空间std里面,然后我们每次使用using namespace std ;就相当于回到了没有把他们封装起来的状态,容易命名冲突的问题又暴露出来了,只不过我们平时做函数练习不太会命名冲突才这样。

    2.2注意事项

    (1) 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

    比如在一个.h文件里有一个命名空间:

    1. namespace N
    2. {
    3. int a;
    4. }

    然后在另外一个.h文件里有一个同名的命名空间:

    1. namespace n
    2. {
    3. int b;
    4. }

    然后编译器会整合成一个

    1. namespace N
    2. {
    3. int a;
    4. int b;
    5. }

    (2)在同一个层次上的域是不能重定义的,但是可以在另一个层次的域是可以出现重定义的

    不允许:

    1. namespace n
    2. {
    3. int a;
    4. }
    5. namespace m
    6. {
    7. char a;
    8. }

    但是允许:

    1. namespace n
    2. {
    3. int a;
    4. namespace m
    5. {
    6. char a;
    7. }
    8. }
    9. //使用的时候:
    10. n::m::a='c';

    三、c++输入与输出

    c++的hello world:

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

    说明:

    1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件以及按命名空间使用方法使用std。

    2.cout和cin是全局的流对象,endl是特殊c++符号,表示换行输出,他们都包含在头文件中。

    3.<<是流插入运算符,>>流提取运算符。

    4.使用c++输入更加方便因为他不需要用到像printf/scanf输入输出那样,需要手动控制格式,c++的输入输出是可以自动识别类型的。

    注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应
    头文件即可,后来将其实现在 std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,
    规定 C++ 头文件不带 .h ;旧编译器 (vc 6.0) 中还支持 格式,后续编译器已不支持,因
    推荐 使用 +std 的方式。

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a=1;
    6. char b=98;
    7. double c=1.1;
    8. cout<" "<" " <

     虽然c++的输入输出非常轻松,但我们并不是只能用c++的输入输出就比如说,我们只想输出小数点后两位,这时候我们用c++的语法就没有怎么容易的虽然可以但是会麻烦一些,遇到这种情况建议c++语法夹杂着c的语法.

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a=1;
    6. char b=98;
    7. double c=1.11111;

    四、缺省参数

    4.1缺省参数概念

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

    1. void Func(int a = 0) {
    2. cout<
    3. int main()
    4. {
    5. Func();     // 没有传参时,使用参数的默认值
    6. Func(10);   // 传参时,使用指定的实参
    7. return 0;
    8. }

    4.2缺省参数分类

    (1)全缺省参数

    1. void Func(int a = 10, int b = 20, int c = 30)
    2. {
    3.     cout<<"a = "<
    4.     cout<<"b = "<
    5.     cout<<"c = "<
    6. }

    (2)半缺省参数

    1. void Func(int a,int b=10,int c=20)
    2. {
    3. cout <<"a= "<
    4. cout <<"b= "<
    5. cout <<"c= "<
    6. }

    注意:

    1.半缺省参数必须从右往左依次来给出,不能间隔着给。

    1. int main()
    2. {
    3. Func(10,,30);
    4. }

    2.缺省参数不能在函数声明和定义中同时出现,因为要是声明的缺省,和定义的缺省不一致,那我们调用的时候要用哪种?我们一般在函数声明的时候进行缺省时定义,在函数定义的时候不进行缺省。

    void Func(int a=10,int b,int c=20);
    
    1. void Func(int a,int b,int c=20)
    2. {
    3. cout <<"a= "<
    4. cout <<"b= "<
    5. cout <<"c= "<
    6. }

    3.缺省值必须是常亮或者全局变量。

    4.c语言不支持。(编译器不支持)

    五、函数重载

    自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重
    载了。
    比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个
    是男足。前者是 谁也赢不了! ,后者是 谁也赢不了!

    5.1函数重载概念

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

    5.2函数重载的几个类别

    1. #include
    2. using namespace std;
    3. // 1、参数类型不同
    4. int Add(int left, int right) {
    5. cout << "int Add(int left, int right)" << endl;
    6. return left + right; }
    7. double Add(double left, double right) {
    8. cout << "double Add(double left, double right)" << endl;
    9. return left + right; }
    10. // 2、参数个数不同
    11. void f()
    12. {
    13. cout << "f()" << endl; }
    14. void f(int a)
    15. {
    16. cout << "f(int a)" << endl;
    17. }
    18. // 3、参数类型顺序不同
    19. void f(int a, char b)
    20. {
    21. cout << "f(int a,char b)" << endl;
    22. }
    23. void f(char b, int a)
    24. {
    25. cout << "f(char b, int a)" << endl;
    26. }
    27. int main()
    28. {
    29. Add(10, 20);
    30. Add(10.1, 20.2);
    31. f();
    32. f(10);
    33. f(10, 'a');
    34. f('a', 10);
    35. return 0;
    36. }

    注意第三点,是参数顺序类型不同,而不是强调顺序不同(int a,int b)变成(int b,int a)就不行。

    5.2 c++支持函数重载的原理——名字修饰

    为什么c不支持函数重载但是c++支持呢?

    简单的说就是:程序在编译链接时需要找到函数的地址去进行调用的,而我们在C语言找到函数的地址是通过函数的名字,比如你定义一个函数void fun(int a);就是通过fun这个名字找到的。

    但要是在c++语法中是需要在查找前对名字进行重修饰的,以void fun(int a,double b)为例,就会通过funid这个和名字去查找地址,fun为函数原名,i和d是他的形参数据类型int和double。这样编译器调用时就不会找到 fun(int a)那里去了。

  • 相关阅读:
    Tomcat web.xml文件中的mime-mapping
    day61 layui和分页原理
    保姆式教程:MAC安装Android studio(包括安装JDK,Android SDK),解决gradle下载慢的问题
    两大图灵奖得主力作:计算机架构的新黄金时代
    项目资源管理的流程、技术和工具
    痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计
    修复VS2015没有代码提示的问题【已解决】
    外汇天眼;VT Markets 赞助玛莎拉蒂MSG Racing电动方程式世界锦标赛
    Go map 竟然也会发生内存泄漏?
    一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/qq_64484137/article/details/126896761