第三十六篇,C++基础,关于C++的输入和输出,函数重载,命名空间使用,C++中的动态内存分配(堆空间),C++中的引用的基础概念详解。

岗位需求和学习目标
============================================
   1.岗位需求
        嵌入式应用/软件开发工程师 --》C/C++
        游戏后台服务器开发(脱离了嵌入式)
        音视频开发(小众岗位),机器视觉

   2.学习目标
        熟练掌握C++常用的基本语法,利用C++编写一些简单的面向对象的程序

C++和C语言的联系和区别
============================================
   1.联系  
        C++在C语言的基础上发展起来
        C++融合了C语言全部的语法特性,在此基础上加入了面向对象编程语法规则
        C++=C语言+面向对象语法
        C++是C语言的超集(C++融合了C语言全部的语法特性)
        面向对象的语法:类的封装,对象,多态,虚函数,纯虚函数和抽象类,模板和泛型编程,运算符重载,函数重载,命名空间,引用,STL标准模板库,智能指针....

   2.区别
        第一:C++采用面向对象的思想编程--》稍后学完类和对象再来体会解释这个含义
              C语言面向过程的思想编程
                   面向过程:解决问题的思路--》先想清楚你这个问题的步骤
                                              依据步骤封装函数/调用别人已经写好的函数
                                              调用函数,一步步执行
        第二:C头文件    #include <string.h>
                        头文件后缀名.h          myhead.h
              C++头文件  #include <cstring>  //把.h去掉,前面加个c
                        头文件后缀名.hpp或者.h  myhead.hpp或者myhead.h
        第三:C源码     .c结尾
              C++源码   .cpp结尾
        第四:C编译器     gcc/arm-linux-gcc
                          gcc  hello.c  -o  hello
                          ./hello
              C++编译器   g++/arm-linux-g++
                          g++ hello.cpp  -o  hello
                          ./hello
              安装g++     sudo apt-get install g++
        注意:如果你写的C++代码,全部使用了C语言的语法特性,没有使用任何C++语法新特性,你用gcc/g++编译都是可以
              如果你写的C++,哪怕只用到一点点C++新特性,必须用g++编译


C++的输入和输出
============================================  
  1.输出
       C语言: printf         
       C++:cout<<输出的变量名  或者你继续使用printf也行(鄙视你)
            比如:cout<<"hello c++"<<endl
                  cout<<a<<endl;           //打印单个变量
                  cout<<a<<b<<c<<d<<endl;  //同时打印多个变量
       回车换行:C语言  \n
                 C++   endl或者\n 
       注意的问题:
                 cout打印指针的时候,如果是char *指针,cout默认把它当成字符串打印,不会当成指针/地址打印
                 如果char *你要打印地址,必须强制类型转换

  2.g++比gcc更加严格
       例子一:char *p="China";   // "China"是个字符串常量,常量不可以修改,所有指针必须用const修饰
               C语言gcc编译器认为没有问题
               C++编译器g++给出警告
                        const char *p="China";
       例子二:void*转换成其他类型指针
               C语言 int *p=malloc(4);
               C++   int *p=(int *)malloc(4);
                   
  3.输入
      C语言: scanf
      C++:cin>>变量的名字
           比如:int a;
                 float b;
                 cin>>a;  
                 cin>>b;
                 cin>>a>>b;  //同时获取多个变量,等价于scanf("%d%f",&a,&b)
      注意的问题:
           初学者总喜欢给变量取地址  cin>>&a;(初学者中了scanf的毒)


函数重载
============================================
  1.概念
       C语言没有这个语法特性
       C++允许在同一个代码中定义多个相同名字的函数,但是要求函数的参数类型/参数个数不同
    好处
       实现了接口的统一(在你的程序中相似功能的函数都有一个共同的名字)

  2.底层原理
       g++会依据函数调用的时候传递的实参类型以及实参的个数,自动匹配对应版本的重载函数

  3.需要注意的问题
       第一个:函数名必须相同
       第二个:参数的个数或者类型从左到右至少有一个是不同的
       第三个:函数的返回值不作为重载的区分标准


命名空间(名称空间)
============================================ 
  1.作用
       跟C语言static类似,用来解决变量名字冲突的问题

  2.语法规则
       namespcace 命名空间的名字
       {
           各种变量;函数
       }

  3.使用命名空间
        写法一:命名空间的名字yy::变量名n(函数)
                比如:  yy::n

#include <iostream>
using namespace std;
 
// 定义第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 定义第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
int main ()
{
 
   // 调用第一个命名空间中的函数
   first_space::func();
   
   // 调用第二个命名空间中的函数
   second_space::func(); 
 
   return 0;
}


    写法二:使用using声明命名空间
             比如: using namespace yy;
              后面要使用n,就只需要写名字即可

#include <iostream>
using namespace std;
 
// 定义第一个命名空间
namespace first_space
{
   void func()
   {
      cout << "Inside first_space" << endl;
   }
}

// 定义第二个命名空间
namespace second_space
{
   void func()
   {
      cout << "Inside second_space" << endl;
   }
}

using namespace first_space;//表示使用第一个命名
int main ()
{
 
   // 调用第一个命名空间中的函数
   func();
   
   return 0;
}


  4.重新认识std
        using namespace std; //我要使用命名空间std
        std: 在系统的头文件iostrteam中定义的一个命名空间
             namespace std
             {
                 cout;
                 cin;
                 endl;
             }      
 

C++中的动态内存分配(堆空间)
============================================ 
   1.C语言动态内存分配
           malloc()  calloc()  realloc()
           free()         

void *calloc(size_t nmemb, size_t size);
                 返回值:指向你申请的堆空间的首地址
                   参数:nmemb --》你打算申请多少块堆空间
                         size --》每一块堆空间的大小
             比如: malloc(10*sizeof(int))
                    calloc(10,sizeof(int));
void *realloc(void *ptr, size_t size);  //改变已经申请的堆空间的大小,重新分配新的堆空间
                 返回值:指向你重新分配的堆空间的首地址
                   参数:ptr --》原本已经申请的堆空间首地址
                         size --》新的堆空间大小
             比如:最开始
                       int *p=malloc(10*sizeof(int))
                   我发现堆空间申请少了,不够用
                       realloc(p,400);
                   我发现堆空间申请多了,减少
                       realloc(p,8);

   2.C++动态内存分配
          新增两个关键字new和delete实现堆空间的申请和释放
          写法一:                

int *p=new int;  //等价于int *p=malloc(sizeof(int));申请4个字节
                 *p=78;
                 delete p;       //等价于free(p);

          写法二:               

 int *p=new int[10]; //等价于int *p=malloc(10*sizeof(int));申请40个字节
                 p[0]=78; p[1]=96;
                 *p=78;  *(p+1)=96;
                 delete []p;


          写法三:                 

int *p=new int(10); //等价于int *p=malloc(sizeof(int));和 *p=10;
                 delete p;


          总结:new申请的使用使用了[],那么delete释放的时候就要使用[]

                 
C++中的引用
============================================
   1.什么是引用
          引用就是变量的别名
          C语言中传递参数只有两种方式:传值   传地址(指针)
          C++中传递参数只有三种方式:传值   传地址(指针)   传引用

   2.语法规则
          类型 &引用的名字=变量;
          比如:
             int a=99;
             int &b=a; //定义int类型的引用b,b是a的引用(b是a的别名,b是指向a的引用)
          引用该如何用??
             引用指向的变量怎么用,引用就怎么用
             比如:
                  float a=89.6;
                  float &b=a;

   3.引用的好处/特点
          第一:引用作为函数的形参,可以节约内存空间
                引用不会占用额外的内存空间,引用的内存跟它指向的变量是同一个内存
          第二:引用具备了传值和传地址的双重属性
          第三:引用必须在定义的时候立马初始化(引用作为函数形参的时候例外)

   4.经典面试问题
          请问指针和引用有啥区别??
                 第一个:引用必须在定义的时候立马初始化
                         指针没有这个要求
                 第二个:指针是独立的变量,拥有独立的内存空间
                         引用依赖于指向的那个变量,跟那个变量是同一个东西(同一个东西有两个名字)
                 第三个:指针可以修改指向的地址
                         引用不可以修改指向新的变量
                               int a=89;
                               int b=54;
                               int &c=a;
                               c=b;  //等价于a=b


练习
============================================ 
  1.定义一个学生结构体
         struct student
         {
             char name[20];
             int age;
         };
    定义结构体变量,cout和cin配合,输入,输出学生信息
  2.定义不同版本的重载函数
  3.熟悉new和delete的用法(换成其他类型的指针)
    熟悉calloc和realloc的用法


作业
============================================
  1.重载三个版本的getarea()函数,分别求矩形,圆形,三角形的面积
  2.查询cout输出,小数点位数设置
                cout<<setprecision(2)<<a<<endl;  //2表示小数点后面2位有效数字
                  如何打印八进制   十六进制
                cout<<oct<<b<<endl;  //八进制
                cout<<hex<<b<<endl;  //十六进制

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖爱Kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值