c++基础篇(一篇文章带你进入c++的新手村)

news2024/12/24 7:04:23

前沿:

        c++作为目前比较的流行的语言之一,在就业上也是运用比较广泛的语言之一,并且经过这么多年的历练久经不衰,所以说选择学c++是一个不错的选择^_^,前面看到一个段子,如何在21天精通c++,我动态里有这张图片,一个努力的程序员经过几年的磨练也只能说是熟悉c++,对于语言的学习并不可能有速成班,都是不断的积累,c++也是如此,但相比较c语言,c++的语法特性繁琐复杂,知识点比较琐碎,它是对c语言一些缺陷的完善,并且保留c语言的所有特性,也就是c语言能用的在c++中也能实现,在学习过程中,一定要做好总结和思维导图的构建,把每个知识进行良好的串联在一起,才能熟悉的运用它,而本篇博客也只是初步的认识一下c++,只能让你浅浅的进入新手村。

思维导图:

目录

 一、命名空间:

1.1命名空间存在的意义:

1.2命名空间的定义:

1.3命名空间的使用:

二、c++的输入与输出:

2.1第一个c++函数:

2.2c++的输入与输出:

三、缺省参数:

3.1缺省参数的定义:

3.2省参数的分类:

四、函数重载:

4.1函数重载的意义:

4.2函数重载的概念:

4.3函数重载的列举:

五、引用:

5.1引用的概念:

5.2引用的特性:

5.3引用的应用:

5.5引用和指针的区别:

六、内联函数:

6.1内敛函数存在的意义:

6.2内敛函数的定义:

6.3内敛函数特性:

总结:


 

 一、命名空间:

1.1命名空间存在的意义:

         1.1.1要知道c++是对c语言缺点的完善,而在c语言中我们是知道,定义变量、函数名或者全域名是不能相同的,否则会产生冲突,但要知道这都是大量存在的,就像一个名字也有很多重名,一个项目,每个人负责不同的模块,也避免不了名字相同(因为我不知道你也用了这个名字),在c语言中就会产生冲突,而且在全域中也可能和库函数中名字相同例如:

 #include<stdio.h>
 #include<stdlib.h>
 int rand=10;//编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数
 int main()
{
 
   printf("%d\n",rand);
      return 0;
}
  

这里编译错误在c语言中就是没办法避免的,所以c语言编译就要避免和c语言库里函数名相同,这是很麻烦的,要知道我们并不能知道所有库函数,而c++命名空间的存在就解决了这个问题。

1.2命名空间的定义:

        1.2.1命名空间的定义要用到一个关键字就是namespace加命名空间的名字,然后接一个{ },里面就是命名空间的成员。

 //这我定义的名字为xiaoma
namespace xiaoma
{
  //可以定义变量也可以定义函数
   int rand =10;
   int Add(int x,int y)
   {
         return x+y;
   }

        //同时也可以进行嵌套
         namespace hello{   
                     //嵌套在命名空间xiaoma的命名空间hello
                       //不同命名空间里的名字可以相同
                int rand=20;
            int Add(int x,int y)
               {
                    return x+Y;
                }


                        }

}

1.3命名空间的使用:

        1.3.1命名空间中的成员并不能直接使用,有三种形式使用方式:

<1>加命名空间名称以及作用域符号:

 namespace xiaoma
{
         int a=10;
         int b=20;
}
int main()
{
      //  printf("%d\n",a) 这种是错误的不能直接使用
          printf("%d\n",xiaoma::a);
          printf("%d\n",xiaoma::b);
        return 0;
}

<2>使用using将命名空间某个成员引入:

 namespace xiaoma
{
         int a=10;
         int b=20;
}
usinng xiaoma::a;
int main()
{
      //  printf("%d\n",a) 这种是错误的不能直接使用
          printf("%d\n",a); //这个已经被引入了所以可以直接用
          printf("%d\n",xiaoma::b);
        return 0;
}

<3>使用using namespace命名空间的引入

namespace xiaoma
{
         int a=10;
         int b=20;
}
usinng  namespace xiaoma;
int main()
{
        printf("%d\n",a); 
        printf("%d\n",b);
        return 0;
}

二、c++的输入与输出:

2.1第一个c++函数:

    2.1.1就像学习c语言一样,我们学习c++也们也来写第一个c++函数。

#include<iostream>
using namespace std;
int main()
{
        cout<<"Hello World"<<endl; //endl表示换行的意思
           return 0;
}

2.2c++的输入与输出:

#include<iostream>
using namespace std;
int main()
{
        int a;
        double b;
        char c;
         //可以自动识别变量类型
          cin>>a;
          cin>>b>>c;
          cout<<a<<endl;
           cout<<b<<' '<<c<<endl;      
        return 0;
}

    2.2.1cout(输出)和cin (输入)的使用必须包含头文件<iostream>和以及按命名空间使用方法使用std.

    2.2.2<<是流插入运算符,>>是流提取运算符。
    2.2.3std是C++标准库的命名空间,怎么理解呢?他就好比一个围墙,把标准库全放放在里面,而我们要访问,就需要透过围墙来进行访问。

三、缺省参数:

3.1缺省参数的定义:

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

#include<iostream>
using namespace std;
int Add(int x=10,int y=20)
{
    return x+y;
}
int main()
{
    
    int ret1=Add();  //不穿参数,使用形参默认值
    cout<<ret1<<endl;
    int ret2=Add(1,2)  //穿参数,使用指定实参
    cout<<ret2<<endl;
    return 0;
}

3.2省参数的分类:

3.2.1全缺省参数:

#include<iostream>
using namespace std;
int Add(int x=10,int y=20,int z=30)
{
    return x+y+z;
}
int main()
{
    
    int ret1=Add(); //可以不传参数
    int ret2=Add(1); //可以传一个参数
    int ret3=Add(1,2); //可以传两个参数
    int ret4=Add(1,2,3); //可以传三个参数
    //但不能像Add(,2,3)或者这样Add(1,,3)传参,必须是从左到右连续滴传参。
          cout<<ret1<<endl<<ret2<<endl<<ret3<<endl<<ret4<<endl;
}

3.2.2半省参数:

#include<iostream>
using namespace std;
int Add(int x,int y=20,int z=30)
{
    return x+y+z;
}
 //半省参数必须从右向左依次赋值
int Add1(int x,int y,int z=30)
{
    return x+y+z;
}
//上面两种都是可以的
//但不能中间间隔例如:int Add(int x=10,int y,int z=30)
//或者这样也是不行的 int Add(int x=10,int y,int z)
int main()
{
    int ret1=Add(1,2,3);//可以
    int ret2=Add(1,2);//可以
    int ret3=Add(1);//可以
   // int ret4=Add(); 不可以的x需要传参
同样滴
      int ret5 =Add1(1,2,3);//可以
      int ret6=Add(1,2);//可以
     //  int ret7=Add(1); 不可以因为y没有传参

  //半缺省参数是要赋值的

    return 0;
}

四、函数重载:

4.1函数重载的意义:

      4.1.1在日常生活中我们也经常遇到一个词表达不同的意思,例如中国的体育项目的两大极端:

乒乓球和足球一个是“谁也赢不了”另一个也是“谁也赢不了”相同的词表达这不同的意思,c++中的重载也在此体现来。

4.2函数重载的概念:

      4.2.1是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这

些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。

4.3函数重载的列举:

#include<iostream>
using namespace std;
int Add(int x,int y,int z)
{
       return x+y+z;
}
//参数个数不同
int Add(int x,int y)
{
       return x+y;
}
//参数类型不同
double  Add(double x,double y)
{
       return x+y;
}
//参数顺序不同
double  Add(int x,double y)
{
       return x+y;
}
double  Add(double y, int x)
{
       return x+y;
}
int main()
{
     int  ret =Add(1,2,3);
     int  ret1=Add(1,2);
     double   ret2=Add(1.2,2.2);
     double   ret3=Add(1,1.2);
     double   ret4=Add(1.2,1);  //函数重载的作用就是一个函数可以实行多种功能
    cout<<ret<<endl<<ret1<<endl<<ret2<<endl<<ret3<<endl<<ret4<<endl;
    return 0;
}

五、引用:

5.1引用的概念:

   5.1.1引用比较好理解啦,就是给你原有的变量去了一个别名,例如在生活中你的外号,就像叫我小马一样都是别名的意思,编译器不会给引用变量开辟新的内存,他和他引用的变量公用同一个内存空间。

#include<iostream>
using namespace std;
int main()
{
    int a=10;
    int& ra=a;
    printf("%p\n",&a);  //打印a的地址
    printf("%p\n",&ra);    //打印ra的地址 两个地址是相同的 
     return 0;
}

5.2引用的特性:

<1>引用变量必须初始化。 就像你给一个人起小名要有对象呀

<2>一个变量可以有多个引用。  一个人可以有多个外号什么的

<3>引用一旦引用一个实体,再也不能引用其他实体。

#include<iostream>
using namespace std;
int main()
{
    int a=10;
    int&ra=a; //这是引用的初始化
    // int&ra; //这里没有初始化是不正确的。
    int& rb=a; //一个变量可以有多个引用
    
    return 0;
}

5.3引用的应用:

      5.3.1引用做参数:

    通过引用的概念我们可以知道引用是和他的引用变量用同一个地址,所以改变引用就是改变他所引用的变量,就像夸小马文章写的好不就是在夸我吗^ _ ^。

#include<iostream>
using namespace std;
void swap(int& x,int& y)
{
    int tmp=0;
    tmp=x;
    x=y;
    y=tmp;
}
int main()
{
    int x=10;
    int y=20;
    swap(x,y);
    cout<<x<<' '<<y<<endl;
    return 0;
}

5.3.2引用做返回值:

#include<iostream>
using namespace std;
int& Add(int x,int y)
{
    static int ret=x+y; //想想这里为什么用static
    return ret;
}
int main()
{
   int ret=Add(1,2);
    cout<<ret<<endl;
    return 0;
}

      在这里我们想一下为什么要用static 要是不用static的后果是什么呢? 在我们讲函数栈帧的创建和销毁的时候已经知道,局部变量是储存在栈区的,而栈区是随着函数调用结束后是会被销毁的, 但引用是和引用对象一个地址的,static是把局部变量从栈区存放到静态区,这样随着函数的调用结束后不会被销毁,因此返回的时候还能够找到,要是不用static当返回去寻找的时候是找到的就会是随机值。就好比你住个酒店,而当你退房了之后,发现你的包裹没有拿,而当你返回去的时候,你就无法确定你的包裹还在,他可能还在就是没有被收拾,但有可能你住的酒店已经被其他用户住给扔掉了,这都是有可能的,而static就是把包放在一个储存的东西的地方,你再去这个地方拿就行了。

5.5引用和指针的区别:​​​​​​​

5.5.1引用就是引用对象的一个别名,而指针是变量的地址/

5.5.2引用必须初始化,而地址不需要初始化。

5.5.3引用在初始化一个引用对象后就不能在引用其他变量了,而指针确可以在任何时候指向同类型的地址。

5.5.4引用自身加一是引用对象加一,而指针加一则是地址加一。

5.5.5指针有多级指针,而引用没有

六、内联函数:

6.1内敛函数存在的意义:

  在c语言中调用一个函数要经过栈帧的创建和销毁,而当一个函数调用次数过多的时候就会降低程序运行的效率。这里的解决办法是什么呢?在c语言中有一个解决的方法就是宏函数。想必大家也忘了宏函数的写法了,这里我写一个宏函数的代码。

#include<iostream>
using namespace std;
#define Add(x,y)   ((x)+(y))
int main()
{
    int ret=Add(1,2);
    cout<<ret<<endl;
    return 0;
}

为什么宏函数解决了效率呢,要知道一个程序运行的完整运行,是有预处理,编译,汇编,链接四个过程的,而宏函数是在预处理已经完成了。但宏函数已经解决了c栈帧创建和销毁的缺点,为什c++还会创建一个内敛函数呢?要知道虽然宏函数解决了效率问题,但它本身也有自身的缺点,我们可以看出宏函数还是很容易写错的,我这个是比较简单的,要是复杂一点就是很容易就写错的,而宏函数因为在预处理就已经结束了,所以是没有办法调试的,并且他也没有类型安全的检查,因此c++就用内敛函数来解决这个问题。

6.2内敛函数的定义:

       6.2.1以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。
#include<iostream>
using namespace std;
inline int Add(int x,int y)
{
     return x+y;
}
int main()
{
    int ret =Add(1,2);
    cout<<ret<<endl;
    return 0;
}

内敛函数和普通函数功能相同就是在函数inline同时也具有了宏函数的一些功能就是不参与编译,在预处理就已经完成了。

6.3内敛函数特性:

      6.3.1  inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会 用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
行效率。
      6.3.2  inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、
是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
      6.3.3 inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到

总结:

     对于这篇文章讲的只是让我们初步的了解认识c++语言,就相当于进入一个新手村才刚刚开始,而c++的脊髓还在后面,就是c++引入类的概念,使c语言的面对过程变为了面对对象,这才是c++魅力所在,而这篇文章让我们可能看的懂一点点简单的c++文章,但浅浅的总结小马也写了5000+字数,对于一些东西还是栈帧的理解深度,所以对于栈帧不理解的伙伴一定要认真看看栈帧,我前篇的文章哈哈哈哈,还有一定要注重思维导图和总结!!

  ^_^最后小马码文不易,如果觉得文章有帮助的可以点赞关注,希望我们一同学习,共同进步!!!

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git 记录

git 工作区介绍 workspace&#xff1a;工作区&#xff0c;就是平时存放项目代码的地方。Index/Stage&#xff1a;暂存区&#xff0c;用于临时存放你的改动&#xff0c;事实上只是一个文件&#xff0c;保存即将提交到文件列表信息。Repository&#xff1a;仓库区&#xff08;或版…

单机hbase-2.4.15配置snappy压缩

单机hbase配置snappy压缩 前言 1. 过程比较坎坷&#xff0c;网上帖子说法不一&#xff0c;以下过程是参考几个帖子亲自走过一遍&#xff0c;并最终可以成功建表。2. 本人安装的所有目录均为/data/test-hbase&#xff0c;涉及目录的替换为自己的目录即可。参考连接 https://bl…

【黑马程序员】Redis 课程 P37 的练习_三种方式实现功能_【黑马点评项目】给店铺类型查询业务添加缓存

本博客内容对应的视频为&#xff1a;https://www.bilibili.com/video/av766995956/?p37补充介绍&#xff1a;【黑马点评项目】是黑马官方于 2022-02-28 在 BiliBili 发表的学习视频教程的练手项目 1.简介 练习&#xff1a;给店铺类型查询业务添加缓存 店铺类型在首页和其它多…

栈和队列(顺序表、单链表形式)

栈和队列栈栈.顺序表结构体的设计栈的初始化栈的销毁入栈出栈获取栈顶数据判断栈空栈中有效元素的个数Stack.hStack.ctest.c栈.单链表结构体设计栈的初始化栈的销毁入栈出栈获取栈顶元素判断栈是否为空获取栈中元素个数Stack.hStack.ctest.c队列队列.顺序表结构体的设计队列的初…

学生HTML个人网页作业作品 简单的IT技术个人简历模板html下载 简单个人网页设计作业 静态HTML个人博客主页

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Python老手也会犯的20个新手级错误

Python编码时应避免的常见错误 编程&#xff08;不仅Python&#xff0c;也包括其它编程语言&#xff09;最好的一点是&#xff0c;有多种方法来实现同一解决方案。 使用不同的方法来达到相同的结果&#xff08;图像由作者绘制&#xff09; 由于下述原因&#xff0c;有些方法会比…

几款很好看的爱心表白代码(动态)

分享几款好看的爱心表白代码❤️爱心代码❤️&#xff08;C语言&#xff09;❤️流动爱心❤️&#xff08;htmlcssjs&#xff09;❤️线条爱心❤️&#xff08;htmlcssjs&#xff09;❤️biu表白爱心❤️&#xff08;htmlcssjs&#xff09;❤️matlab爱心函数❤️&#xff08;需…

Java类和对象(一)

&#x1f380;作者&#xff1a;爱塔居的博客_CSDN博客-领域博主 &#x1f32d;专栏&#xff1a;JavaSE &#x1f367;作者简介&#xff1a;大三学生&#xff0c;想要努力地变得更好&#xff01; 附上一张可可爱爱的猫猫图~ &#x1f353;&#x1f353;&#x1f353;&#x1f35…

论文学习——多度量水文时间序列相似性分析

文章目录摘要1 研究背景1.1 主要研究内容1.2 研究背景1.3 启发2 基于改进BORDA投票法的多度量水文时间序列相似性分析2.1 研究方法2.2 BORDA投票法的改进2.2.1 BORDA 的缺点2.2.2 改进的BORDA投票法3 实验验证与分析3.1 实验数据3.2 实验结果分析4 结语多度量组合可以提高相似性…

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

目前只测试了与大华摄像机的语音对讲功能&#xff0c;在此记录下对接工程中遇到的问题和收获。 首先我们需要理清下思路&#xff1a; 第一步要熟悉语音对讲的协议流程&#xff0c;下图为国标28181中的参考图&#xff1a; 这里我们可以简化下流程&#xff0c;只参与与摄像机的…

计算机网络第二章知识点回顾(自顶向下)

第二章知识点回顾1.应用层1.1网络应用架构1.1.1客户-服务器架构1.1.2P2P架构1.1.3两种架构的对比1.2不同终端上的进程通信1.3进程与网络的接口&#xff1a;套接字1.4进程如何标识自己&#xff1a;进程编址1.5因特网提供的传输服务小结1.6Web应用画像1.7 HTTP协议1.7.1HTTP使用T…

大数据技术基础实验十三:Kafka实验——订阅推送示例

大数据技术基础实验十三&#xff1a;Kafka实验——订阅推送示例 文章目录大数据技术基础实验十三&#xff1a;Kafka实验——订阅推送示例一、前言二、实验目的三、实验要求四、实验原理1、Kafka简介2、Kafka使用场景五、实验步骤1、配置各服务器之间的免密登录2、安装ZooKeeper…

【C++】优先级队列 priority_queue的使用模拟实现 | 仿函数

&#x1f308;欢迎来到C专栏~~优先级队列的使用 & 模拟实现 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01…

聚乙二醇衍生物MAL-PEG-NH2,Maleimide-PEG-amine,CAS:1207751-12-9​

英文&#xff1a;MAL-PEG-NH2&#xff0c;Maleimide-PEG-amine 中文&#xff1a;马来酰亚胺-聚乙二醇-氨基 2、CAS编号&#xff1a;1207751-12-9 3、所属分类&#xff1a;Amine PEG Maleimide PEG 4、分子量&#xff1a;可定制&#xff0c;5000、2000、3400、20000、10000、…

【附源码】Python计算机毕业设计汽车租赁网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

eBPF学习笔记(一)—— eBPF介绍内核编译

eBPF学习笔记&#xff08;一&#xff09;—— eBPF介绍&内核编译eBPF介绍eBPF基础代码验证即时编译eBPF开发工具BCCbpftracelibbpf C/C库eBPF Go库内核编译查看内核版本下载内核源码安装依赖项安装最新版llvm和clang配置内核编译内核BPF示例程序常见问题问题一&#xff1a;…

C++ 堆、大顶堆、小顶堆、堆排序

目录一、什么是堆&#xff1f;1.1 大顶堆1.2 小顶堆1.3 自定义greater1.4 堆索引的特点1.5 堆操作添加元素删除最大元素检查序列是否是堆检查部分序列为堆对堆进行排序升序降序问题&#xff1a;sort()和sort_heap()有什么区别二、排序算法&#xff1a;堆排序2.1 堆排序原理创建…

Bootstrap框架(全)

Bootstrap中文网&#xff1a;点我直达 Bootstrap菜鸟教程&#xff1a;点我直达 目录&#xff1a;&#xff08;一&#xff09;Bootstrap标准模板&#xff1a;&#xff08;二&#xff09;CSS样式区&#xff1a;一、布局容器&#xff1a;二、栅格系统&#xff1a;1.列组合&#x…

<Linux> 软件包管理器yum及编辑器vim的使用

文章目录一、yum的背景知识1. 商业生态2. 开源生态3. 软件生态本土化二、yum 的基本使用1. 查看软件包2. 安装、卸载、搜索软件实现Windows下和Linux下文件互传三、vim的基本使用1. vim 的基本概念2. vim 的基本操作2.1.模式间切换2.2.插入模式2.3.命令模式2.4.底行模式四、vim…

nginx(四十二)access阶段的模块学习

一 ngx_http_access ① 基本描述 场景&#xff1a; 限制某些ip来源的访问;基于ip进行限制细节点&#xff1a; 基于$remote_addr进行判断的 ② allow deny ③ 官方案例 说明&#xff1a; 按照配置文件中allow|deny的先后顺序,只要匹配上则停止继续匹配 ④ 经典应用场…