[C++]入门基础(1)

Hello大家好,今天通过本篇文章,我们来初步学习C++,C++可以说是对C语言的一个升级,我们会一步一步的由浅入深的学习C++。

目录

1.第一个C++程序

2.命名空间

[2.1 命名空间出现的意义](#2.1 命名空间出现的意义)

[2.2 namespace的定义](#2.2 namespace的定义)

[2.3 命名空间的使用](#2.3 命名空间的使用)

3.C++输入&输出

4.缺省参数

5.函数重载

总结:


1.第一个C++程序

大家都知道,每一个语言都有我们的第一个程序,也就是hello world,那么我们C++的helloworld程序应该怎么写呢,我们可以看一下,代码如下。

#include<iostream>
using namespace std;
int main()
{
	cout << "hello world" << endl;
	return 0;
}

观察上面的代码,我们可以与C的程序进行比较,我们可以发现,二者比较相似,因为C++就是由C语言发展而来的,C++包含的头文件并不是<stdio.h>,C++的标准头文件是<iostream>,还有namespace命名空间的使用,以及输入输出的不同,我们都会在后面讲到。

大家可能有疑问,为什么C++头文件没有.h后缀呢,这是由于在C++的发展中,最早之前的头文件也是含有.h后缀的,但是之后为了区分新老版本,就在新版本中将头文件的后缀去掉了,如果你在一些比较老的编译器中,还是可以使用<iostream.h>的,只是已经比较少了。

我们接着向下讲C++知识

2.命名空间

我们通过上面的第一个C++程序,或者如果之前见到C++语言,我们都很容易发现都会有这句话

using namespace std;

那么这句话到底是干什么的呢?这就涉及命名空间的知识了。

2.1 命名空间出现的意义

正如名字命名空间描述的一致,命名空间实质上像是一个空间,即一作用域。

我们在之后的C++程序中,会使用到大量的函数和类变量,这些变量都会存在于全局作用域中,可能会导致许多命名冲突,这时如果我们将变量,函数放到不同的命名空间中,我们就能避免这些冲突 ,这就是namespace出现的意义。

举个具体的例子

在后面我会用命名空间,来解决这个问题

2.2 namespace的定义

  • 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

如图所示,我们自己创建了一个命名空间lmd,里面可以放变量,函数,以及创建的结构体类型

  • namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。

我们可以试着解决一下,刚才函数名和变量名冲突的问题

很显然这个问题以及解决了

同时我们也发现,要使用作用域里的东西,需要在变量名前加 :: 这个符号,标明你所用的变量出自那个作用域

  • C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期,命名空间域和类域不影响变量声明周期。
  • namespace只能定义在全局,当然他还可以嵌套定义。
  • 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。

多文件种定义同名的namespace会被合并为同一个namespace,并不会发生冲突。

  • C++标准库都放在⼀个叫std(standard)的命名空间中。

也就是我们平常使用的using namespace std;

2.3 命名空间的使用

命名空间的使用即使用using namespace + 命名空间的名字

这个操作相当于将命名空间展开

注意:这里的展开与C语言中头文件的展开并不一致

命名空间相当于一个带边界的空间,当我你们使用using时,会将这个边界打开,即命名空间的使用,并不是将namespace中的各中变量拷贝到文件中去。

但是请注意:展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。

3.C++输入&输出

  • <iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
  • std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输入流。
  • std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
  • <<是流插入运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

在C++中,有许多符号在不同的地方有不同的含义,这里>>和<<就是一个例子

  • 使⽤C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输⼊输出可以自动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。

如图所示,在C++由于可以字段识别类型,可以减少冗杂的代码量,让我们非常的舒适。

  • cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使方式去使用他们。
  • ⼀般⽇常练习中我们可以using namespace std,实际项目开发中不建议using namespace std

这样可以将std::cin,std::cout直接写为cin和cout非常的方便,但是如果在开发项目中,使用命名空间,可能会导致变量冲突不建议使用。

  • 这里我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

4.缺省参数

什么是缺省参数?

  • 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)

    void Func(int a = 0)
    {
    cout << a << endl;
    }

如图所示即一个缺省参数,当调用Func时,若不给参数,则默认a = 0,若给参数,a就等于所给的参数。

  • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

可以看到不能间隔跳跃给缺省值

  • 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。

可以看到在调用缺省函数时,不能跳跃给实参。

  • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现 ,规定必须函数声明给缺省值。

5.函数重载

C++支持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同⼀作用域中出现同名函数的。

以上便是函数重载的一个实例,可以发现函数重载十分方便,能用一个函数名完成多种内部实现

要实现函数重载必须满足一个及以上下面的条件

  1. 参数类型不同
  2. 参数个数不同
  3. 参数类型顺序不同

注意:返回值不能作为重载条件,因为在调用时也无法区分

总结:

以上便是,我们初识C++入门基础的第一章内容,主要讲了命名空间,输入输出,缺省参数及函数重载,希望对你有所帮助。

相关推荐
AI街潜水的八角3 分钟前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
q5673152320 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
JSU_曾是此间年少32 分钟前
数据结构——线性表与链表
数据结构·c++·算法
许野平1 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨1 小时前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp2 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式