文章目录

  • C++入门第一课
  • 1. C++发展简史
  • 2.C++关键字
  • 3.C++运行环境
  • 4.C++头文件以及输入输出
    • 4.1 头文件
    • 4.2输入输出
  • 5.命名空间(namespace)
    • 5.1命名空间的定义
    • 5.2解决命名冲突
    • 5.3命名空间的特点
    • 5.4命名空间的使用
  • 6.using的使用
    • 6.1使用using释放命名空间
    • 6.2如果不使用using
    • 6.3释放特定命名空间
  • 7.缺省参数
    • 7.1全缺省和半缺省
      • 7.1.1 全缺省
      • 7.1.2半缺省
    • 7.2缺省参数的注意事项总结
    • 7.3缺省参数的应用
  • 8.结语

C++入门第一课

1. C++发展简史

C/C++语言的产生都是从大名顶顶的贝尔实验室里被研发出来的,最早期C语言被广泛应用做操作系统软件和设备驱动程序设计的首选语言,UNIX操作系统就是使用C语言开发的第一个大型软件系统。并且实际上,现在的大多数操作系统都是用C/C++语言实现的。

但是随着C语言的广泛使用,出现了许多不兼容的版本,这对于C的可移植性来说是一个非常严重的问题,后来C语言又诞生了C99版本。

但是C/C++之父,就是我们的祖师爷Bjarne Stroustrup,也就是本贾尼博士对C语言进行了扩展,所以C++就横空出世啦。

关于C++的设计和演化,本贾尼博士的著作《The Design and Evolution of C++》中有详细的叙述,其中总结了C++的一些设计原则:

  • C++的每一步演化和发展必须是由于实际问题所引起的。

  • C++是一门编程语言,而不是一个完整的系统

  • 不能无休止地一味追求完美

  • C++再其存在的“当时”必须是有用处的

  • 每一种语言特性必须有明确的实现方案

  • 总能提供一种变通的方法

    所以说在C++的演化过程中,来自客户的反馈的语言实现者们积累的经验是最为重要的。

2.C++关键字

C++(C++98版本)共有63个关键字,是在C语言32个关键字的基础上进行了扩充。

如果你想了解这些关键字,可以点这里-》传送门

3.C++运行环境

在windows系统中,我们大多都使用一些编译器软件来进行代码编写,比如vs201x编译器,vscode等。

而在linux系统中,则是使用安装g++的编译器进行编译,因为linux系统是才用命令行的形式,比较难上手,所以新手还是先采用熟悉的系统进行代码编写比较好。

我们知道在vs中,如何切换C和C++俩种运行环境,是利用文件名的后缀来进行选择哪个一种语言环境。

例如: Test.c -----C编译器

​ Test.cpp-------C++编译器

而在linux系统中,也是利用文件名后缀来使用对应的编译器。

  • gcc ------C编译器
  • g++ -------C++编译器

4.C++头文件以及输入输出

4.1 头文件

按照上面所说的,我们要使用c++,就是必须创建.cpp后缀的源文件。

在学习C语言的时候,我们会引入 #include <stdio.h>的头文件

这是C语言标准输入输出的库。

而在C++也有自己标准输入输出流的库,也就是 < iostream > 的头文件

在后面C++的学习,也会学到io流的知识,涉及到这个头文件

引入#include < iostream > ,我们可以正常输入输出了

4.2输入输出

在C语言中,我们会运用scanf语句和print语句来进行输入输出

而在C++中,也有自己的语句来进行输入输出

从以上的例子我们可以对比一下C语言的语法

cin>>a;    就相当于     scanf("%d",&a);cout<<a<<endl;  就相当于  printf("%d",a);

我们可以看到 >>和<<这个俩个操作符很熟悉,是我们C语言所学的位操作符

但在C++中,也有另一种含义,一词俩用,分别是

>>流提取运算符

<<流插入运算符

而 cin 是输入 cout 是输出 endl (end of line)是换行

使用 cout 标准输出 ( 控制台 ) 和 cin 标准输入 ( 键盘 ) 时,必须 包含 < iostream > 头文件 以及 std 标准命名空间。
注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,规定 C++ 头文件不带.h ;旧编译器 (vc 6.0) 中还支持 <iostream.h> 格式,后续编译器已不支持,因此 推荐 使用 +std 的方式。
对于命名空间的学习,我们放在下面学习跳转

我们可以看到 a和b都是不同的数据类型,而我们不用在像C语言那样,增加格式控制符(%s,%d,%f)来控制输入输出,

  • 编译器会自己判断它们的类型

    同样的我们也可以通过多次使用<< 或者>>来进行输入输出多个数据

而如果你想控制输出格式,C++控制格式的方式比较复杂

我们也可以直接调用printf语句,毕竟C++是兼容C的

还有endl 我们也可以换成 ’\n ’

5.命名空间(namespace)

在上面使用C++的输入输出的时候,我们使用的是使用 +std 的方式

即是包含 < iostream > 头文件 以及 std 标准命名空间。

#include <iostream>
using namespace std;

这里的std标准命名空间就是C++的一个库,里面定义着C++的****变量,函数,类型****

那命名空间究竟是什么呢?

我们可以知道在我们的main函数里面,如果存在中同名的变量,函数,或者结构,编译器是会报错的。

我们可以举个例子,假如在班上,我们有俩位同学是同名的,但是我们可以通过俩人的附加属性来区别这两人,比如外貌,家庭住址等等

而在C++中,为了对标识符的名称进行本地化,以避免命名冲突或名字****污染

就使用了命名空间(namespace)这个关键字来进行区分

在项目开发里,很多的都是团队开发,如果包含的头文件的库函数,
和自己定义的变量命名相同,会产生冲突(c语言里面没有很好解决这个问题,
只有一方让步)
c++中,cpp引入namespace 解决这个问题

5.1命名空间的定义

定义命名空间,则使用

namespace 关键字 +命名空间的名字

{

命名空间的成员(\变量,函数,结构)

}

5.2解决命名冲突

我们可以知道,同个域内是不能出现同名的参数的

而namespace相当于隔离了参数,不会出现冲突
冲突是因为同个作用域里,不能同时存在

我们可以看到程序正常运行,并没有发生命名冲突

但是我们访问的是main域内的变量,那我们要怎么访问到全局域中命名空间里面的同名变量呢?
这时候就使用在C语言中学习的 ::域作用限定符

域名(空白默认全局域)::访问的变量

同样的,除了定义变量外我们也可以定义同样的结构体在不同的命名空间里,不会产生命名冲突

namespace zhangsan
{struct ListNode{int val;struct ListNode* next;};
}
namespace lisi
{struct ListNode{int val;struct ListNode* next;};
}
int main()
{zhangsan::ListNode* n1 = NULL;lisi::ListNode* n2 = NULL;
}

5.3命名空间的特点

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

namespace zhangsan
{
int a;
}
namespace zhangsan
{
int b;
}

但是我们如果命名空间内如果是定义同样的变量或者结构体,都是会命名冲突的,因为编译器

会合成同一个命名空间中,产生冲突,而且同个命名空间域在不同文件也会冲突

这里我们就可以利用命名空间的第二个特点了

  • 俩个同名命名空间域可以嵌套,可以访问嵌套内的命名空间域
namespace zhangsan
{  namespace data{ struct ListNode{int val;struct ListNode* next;};}}
namespace zhangsan
{namespace cache{ struct ListNode{int val;struct ListNode* next;};}
}
int main()
{zhangsan::data::ListNode* n1 = NULL;zhangsan::cache::ListNode* n2 = NULL;
}

严格按C语言要在结构前面加上struct,上面是以c++方式,已经升级成了类,不用加

struct zhangsan::data::ListNode* n1 = NULL;   //Czhangsan::data::ListNode* n1 = NULL;   //C++

5.4命名空间的使用

namespace zhangsan
{
int a;
int b;
struct ListNode{int val;struct ListNode* next;};
}
int main()
{printf("%d",a);  //该语句编译出错,无法识别a
}

我们可以通过三种方式来使用这个命名空间进行访问

  • 加命名空间名称及作用域限定符

    int main()
    {printf("%d",zhangsan::a);
    }
    
    • 使用using将命名空间中成员引入(using的使用下面会提到)
    using zhangsan::b;
    int main()
    {printf("%d",zhangsan::a); printf("%d",b);
    }
    
  • 使用using namespace 命名空间名称引入

    using namespace zhangsan //成员都可以使用int main()
    {printf("%d",a); printf("%d",b); ListNode* n1 = NULL;
    }
    

6.using的使用

6.1使用using释放命名空间

using 就是把命名空间的内容展开,就相当于把里面的变量或者类型放出来,但是注意命名空间里面的都是全局的。

我们上面所提到的std方式,

using namespace std;//std 封c++库的命名空间

也是运用using 将std的c++标准库放出来,让我们访问使用

6.2如果不使用using

所以我们在用cout输出的时候就不用在前面加上std : :

如果没有使用using的话

我们平时使用使用输出函数就只能打出

std::cout<<"hello world "<<std ::endL;

但是放出来就会存在冲突风险

6.3释放特定命名空间

我们也可以只放出来一个

using std::cout;
int main()
{cout<<"hello world<<std ::endL;return 0;
}

7.缺省参数

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

用通俗易懂的话来说,缺省函数就是一个备胎,在没有指定实参(正房)的时候,缺省函数(备胎)就派上用场了。

void f(int a=6,int b=66)
{cout<<a<<" "<<b<<endl;
}
int main()
{  f(10,20);//指定了实参f();     //没有指定return 0;
}

7.1全缺省和半缺省

  • 像上面这种,函数中的所有形参都设定了缺省值的,叫做全缺省

  • 函数中只有一部分设置了缺省值的,叫做半缺省,

    注意:并不是缺少一半的参数才叫半缺省,一部分也算。

    设置缺省参数的时候,必须从右往左设置,传实参的时候,都是不能出现中间空一个的情况

7.1.1 全缺省

void f(int a=6,int b=66,int c=666)
{cout<<"a=" <<a <<endl;cout<<"b=" <<b <<endl;cout<<"c=" <<c <<endl;
}

像这个函数我们可以传三个参数,也可以传俩个,也可以传一个

但是中间空了一个参数就是不行的

7.1.2半缺省

半缺省函数至少有一个缺省参数

void f(int a=6,int b=66,int c=666);
void f(int a,int b=66,int c=666);
void f(int a,int b,int c=666);

这些都是半缺省的正常形式

  • 半缺省参数必须从右往左依次来给出,不能间隔着给
void f(int a=6,int b,int c=666);//这样是错误的

这里给的是函数声明,这里要特别注意的是

  • 缺省参数 声明和定义不能同时出现(因为怕出现不一样的) 而且只能声明给,定义不给(不能反过来),会产生歧义,因为在编译的时候,先打开头文件,然后遇到函数调用,如果声明中没有缺省参数,拿不到定义,函数定义的出现是在链接,编译器就认为出错了。

7.2缺省参数的注意事项总结

  • 半缺省参数必须 从右往左依次 来给出,并且是连续的,不能隔着给。
  • 缺省参数不能在函数声明和定义中同时出现
  • 缺省值必须是常量或者全局变量
  • C 语言不支持(c语言 编译器不支持)

7.3缺省参数的应用

在我们之前学习顺序表的时候,我们会遇到创建顺序表连续多次扩容的问题,

这样会导致单一默认长度导致的多次扩容(realloc扩容会导致性能浪费)

如果有了缺省参数,我们就可以利用缺省参数来设置设置默认长度

typedef struct SeqList
{int * a;int size;}SL;
void SeqListInit(SL* psl,int n =10)
{psl->a = (int*)malloc(sizeof(int)*n);//默认值为10psl->size = n;}

当我们需要一个很长的顺序表时,就可以直接改默认长度,避免连续多次扩容,造成性能损耗

缺省参数在C语言里面是不支持的

这也算是C++对C语言的优化

8.结语

以上是对C++入门第一课的总结。

希望能帮到大家,谢谢~!

【C++】入门第一课相关推荐

  1. Opencv入门第一课打开窗口

    Opencv入门第一课打开窗口 一.如何打开图片(代码解释如下) Mat src = imread("D:/images/lena.jpg"); 解释:imageread图片读取 ...

  2. 人工智能入门第一课:手写字体识别及可视化项目(手写画板)(mnist)

    人工智能入门第一课:手写字体识别及可视化项目(手写画板)(mnist),使用技术(Django+js+tensorflow+html+bootstrap+inspinia框架) 直接上图,项目效果 1 ...

  3. janusgraph 引入 java_JanusGraph入门第一课和官方文档踩坑

    入门第一课是在IDEA里创建一个项目,有些小曲折.这里运行的Demo是读取janusgraph示例的"神之图"(Graph of the Gods)数据并打印,采用Hbase+ES ...

  4. 摩托入门第一课[老猫]

    摩托入门第一课 老猫 2001-02-24 早就想给新入门的摩托朋友写一点东西了,因为自己当初也是那么的一脸茫然.想不出什么好的题目,就用了"第一课"的字眼,希望读者老兄不要介意. ...

  5. 大数据入门第一课 Hadoop基础知识与电商网站日志数据分析

    大数据入门第一课 Hadoop基础知识与电商网站日志数据分析 本课程从Hadoop核心技术入手,以电商项目为依托,带领你从0基础开始上手,逐步掌握大数据核心技术(如:HDFS.YARN.MapRedu ...

  6. C#编程入门第一课 Visual studio 2019使用,cs文件构成,打开项目文件,两句最简单语句,运行前,运行程序,显示行号,设置字体

    C#编程入门第一课 文章目录 C#编程入门第一课 1 2 3 Visual Studio 2019 4. cs文件构成 5. 打开项目文件 6. 两句最简单语句 7. 运行前 8.运行程序 9.显示行 ...

  7. Linux运维工程师入门第一课-赵永刚-专题视频课程

    Linux运维工程师入门第一课-75人已学习 课程介绍         本课程包含许多工作中会遇到的问题及解决方案,解决大家工作当中遇到的问题.非常适合刚刚入门的同学来学习linux基础入门. 本课程 ...

  8. python编程入门第一课_python入门前的第一课 python怎样入门

    人工智能时代的到来,很多文章说这么一句:"不会python,就不要说自己是程序员",这说的有点夸张了,但确实觉得目前python这个语言值得学习,而且会python是高薪程序员的必 ...

  9. NXP KW38蓝牙开发(一)入门第一课:官网蓝牙广播和连接例程,NMI禁止

    首先要下载开发使用的IDE:MCUXpresso IDE 下载链接: 进入nxp的官网,搜索KW38 向下翻看,找到Xpresso,点击进入 习惯使用IAR开发的同学也可以下IAR版本,这里以Xpre ...

最新文章

  1. Android EditText回车不换行
  2. 神经网络调参---权重对分类性能的影响
  3. 时间设置偏移秒_零偏移有源低通滤波器,第2部分
  4. 状态机-面向对象编程
  5. 分页查询超时问题(1)
  6. php转化为2位小数的数字,学习猿地-php 转化为两位小数的方法
  7. centos搭建NFS服务器
  8. matlab录音函数怎么保存在哪里,利用matlab 录音
  9. 大学生html作业总结,总结 HTML标签作业
  10. 游戏文案策划:资料推荐
  11. 2021-2027全球与中国锁模激光器市场现状及未来发展趋势
  12. 汽车智能化新赛道——CMS国标明年1月1日落地,供应链已提前布局
  13. java-第十三章-类的无参方法(一)-模拟一个简单的购房商贷月供计算器
  14. php模拟QQ登录获得skey码,请教:QQ授权第三方登录论坛之authorize模拟访问,一直失败...
  15. c语言今天星期几问题,C语言输入今天星期几
  16. python描述对象静态特性的数据为_The couple wanted to adopt the black boy they had been _______._学小易找答案...
  17. BP神经网络实现实例1曲线拟合
  18. Python面向对象之访问限制
  19. 高校实验室仪器设备管理系统/高校设备管理系统
  20. Applied Energy期刊小白论文投稿模板-流程经验分享

热门文章

  1. numpy PIL tensor之间的相互转换
  2. Kubernetes基础:问题排查方法示例:结合使用kubectl get event
  3. Numpy 组合数组的几种方法
  4. 1112 KGold
  5. 优麒麟 19.04 正式版发布,激流勇进,精益求精!
  6. 互联网的一些小知识点
  7. Linux 0.11-从内核态到用户态-23
  8. 金蝶云的企业数字化转型之道:从ERP到EBC,从竞争到共生
  9. gta5oracle2数据,GTA5 handling 数据详细研究结果(2018年最新研究)
  10. 【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo...