C++入门详解

1.命名空间

在C语言中,我们无法解决命名冲突的情况,相同的命名会导致很多冲突,C++中的命名空间就是为了解决这一问题而存在的。命名空间可以对我们所取变量名,也就是标识进行本地化,限制其使用的范围,避免命名的冲突。

1.1命名空间的定义 

命名空间的定义基本语法是使用关键字:namespace 后接要取的命名空间的名字,在加上一对{},在{}中的成员我们为命名空间的成员,在命名空间中我们可以定义变量、函数、类型等。

例如:

此外,命名空间也是可以嵌套使用的,并且在一个工程中,命名空间的名称可以相同,最后在编译的时候,多个名称相同的命名空间将会合并为一个。

1.2命名空间的使用

了解了命名空间的定义,我们就可以来使用命名空间中得定义的成员了,正常情况下,在命名空间中被定义的量无法被使用,命名空间中成员的使用是受到限制的,例如以下对命名空间N中成员a的使用,编译器将会报错,显示a为未定义,这就是由于命名空间限制了变量a被发现使用。

要使用,命名空间中某一定义的量时,我们有三种方法。

1.21直接使用,不引用

对于直接使用,不对命名空间进行引用时,这种方法在使用命名空间中的成员时,需要在对应的命名空间配合域作用限定符 :: 使用,但是每次使用该命名空间中的成员时都要如此,如对上面命名空间N中成员a和b的使用

1.22对命名空间中某一个成员的引用

 对于对命名空间中某一个成员的引用,其方法是利用using配合命名空间及域作用限定符对应某一成员引用,在之后对该成员的使用就可以直接使用,但需要注意的是,只有命名空间中被引用的成员才可以直接使用,其他未被引用的成员无法直接使用。

1.23对整个命名空间的引用

对于整个命名空间的引用,其方法是使用using配合namespace加上要引用的命名空间的名称,该方法引用了整个命名空间,命名空间中定义的成员此时均可直接使用。

2.C++的输入和输出

要使用C++中的输入输出,与C语言中所需要引用的头文件不同,C++中应当包含的头文件为:<iostream>,此外同时需要对C++中的标准命名空间std 进行引用,C++将标准库的定义实现都放到这个命名空间中,在使用时我们先需要对其引用。

2.1输入&输出 

C++的输入是依靠标准输入对象cin配合流提取运算符 >> 来实现的,输出是依靠标准输入对象cout配合流插入运算符 << 来实现的,在引用C++中的成员cin、cou时,我们同样可以单独只引用cin、cout也可以直接引用标准命名空间std。此外C++标准命名空间中有单独作为换行的符号endl(end line的缩写),可以更加方便的换行,同时C语言中的换行符"\n"也可以使用。

与C语言中的输入输出不同的是,C++中的标准输入输出能够自动识别变量的类型,对与输入与输出更加的方便。

3.缺省参数

缺省参数是一个在声明或者定义函数时使用的手段,但不能用于C语言中使用,其作用是当调用函数时,如果传递的参数数量不足或者没有传递参数时,给参数设置默认的一个值,缺省参数分为两种情况,一种为半缺省参数,另一种为全缺省参数。需要注意的是,缺省参数在函数的声明和定义中只能有一个给缺省值,如果是在多个文件下,则一定是函数声明那个文件给缺省值,而定义函数的文件不能给上缺省值。

3.1全缺省参数

顾名思义,全缺省参数是给函数参数的每一个参数都设置一个默认值,当调用函数时传递的参数不足或不传参数时,将没有传递参的参数的值赋值为缺省值。例如:

当调用函数不传或者少传参数时,左右往右依次传递对应参数,未传递参值的参数使用缺省默认值。

3.2半缺省参数

半缺省参数与全缺省参数不同,在设置参数的缺省值时没有给所有的参数都设置缺省值,只给了部分参数设置缺省值,这个部分被设置缺省参数的个数并不为函数总参数的一半,此外特别需要注意的是,半缺省参数在给参数设置缺省值时必须是从右往左而且连续设置的。这是因为如果不以这种方式设置缺省值,当调用函数传递部分参数时,不能确定该参数为传递到哪个参数。

可以看到,半缺省参数的参数传递实际上与全缺省参数调用起来其实是差不多的,传参都是从左往右传递给对应的参数,第一个值传递给函数左边第一个参数,第二个传递给函数左边第二个,依次如此,与全缺省参数不同的是,半缺省参数的函数在调用时一定要传递参数,传参数个数至少为没有设置缺省值参数的个数

4.函数重载

函数和重载是C++中一种允许在同一作用域下可以声明定义具有相同函数名的多个函数的情况,用于实现几个功能相似的函数,这些函数的函数名称是相同的,但是参数不同。构成重载函数需要满足两个条件:函数名相同以及函数的参数不同,与函数的返回值的相同与否无关。其中函数名的相同这点应该没有太大问题,主要是函数参数额不同可能会有问题。函数参数的不同又分为两种情况,一是函数参数个数不同,另一个是函数参数类型不同,下面就说明这两种情况。

4.1函数参数个数不同

关于函数参数的个数不同构成的函数重载,我们应该也不难理解,两个函数的参数个数不同,构成重载函数,此外,重载函数中同样可以使用缺省参数,为参数设置默认缺省值,但是需要我们注意的是,如过重载函数都为全缺省参数时,虽然函数能构成重载函数,但是如果在调用函数不传递参数是,在使用上则会产生歧义,编译器不知道调用哪个函数。

4.2函数的参数类型不同

函数参数类型的不同也能够构成多个重载函数,参数类型的不同,多个重载函数中,每个函数之间的参数类型都不完全相同即可,而对于缺省参数的使用,同样与前面函数参数个数不同一样,当多个重载函数为全部缺省参数时,调用重载函数将会出现歧义。

5.引用

C++中的引用是给一个量取别名的操作,引用不会开辟新的空间,引用取的别名所指向的空间与它所引用的量的空间是相同的。

5.1引用的使用

引用的使用是通过类型&加上引用后取的别名来实现的,其中类型&在这里不再是指代取地址的操作,引用的类型与被引用的量的类型一是相同的,且引用操作是一定要进行初始化的

5.11直接引用、常引用

引用可用于直接为一个变量定义一个别名,一个变量可以有多个引用取的别名,它们所指向的都是引用的对象,当别名的值发生改变时,被引用的对象的值发生同样改变。常引用用于引用含有const修饰的变量或者不可改变的常量,在使用时不能扩大其使用的权限,但可以缩小引用对象的权限

 例如变量a是被const所修饰的常变量,不可修改其大小,如过在引用a时,直接引用则变相扩大了a的使用权限,也就是使用别名对a的值可以进行修改,如此定义编译器将会报错,无法运行,对于常b也是同理,而变量c原本没有被const所修饰,但是在引用c的时候加上了const对别名进行修饰,缩小了别名使用的权限,使得通过别名不能对c进行修改。

5.12作函数参数、返回值

当引用作为函数参数时,可以使得改变形参引起对实参的改变,函数将传递的参数视为实参的别名。

 引用作函数返回值时,可以接收函数中定义的量,如函数中定义的静态变量被作为返回值接收得到的是该变量的别名。

5.13引用的优点以及和指针的区别

相同点:在函数参数使用引用进行传递参数比使用值拷贝传递的效率更高,此外,使用引用传递的参数可以对实参进行修改,而值传递不行,这点与指针有着相似之处。

不同点:不同点其一在于引用是不需要额外开辟空间的,引用所指向的空间与被引用的量的地址是相同的,而指针的是需要额外开辟空间来存储的;其二,引用的使用是一定需要进行初始化的,不同于指针的定义可以在定义时置空,引用在定义时一定是要有引用的对象的,不存在空引用这种操作;其三,引用在定义之后,所指向的对象是不可变的,不同与指针,指针所指向的对象是可以改变的。

6.内联函数

内联函数是一个被 inline 所修饰的函数,只要在函数名的前面加上inline就是一个内联函数。如下面一个简单的内联函数。

6.1优缺点

 内联函数与其它函数相比,它在被调用时会在被调用的地方展开,不需要建立函数栈帧,没有调用建立栈帧率的开销,调用时更加高效。

但是内联函数是一个用空间换时间的做法,虽然能够优化程序的运行效率,但同时也会增大目标文件的空间大小,此外,内联函数不是在函数前面加上inline就能够使用内联函数的方式运行的,内联函数一半只能针对少量代码的函数运行使用,在函数前面加上inline所起到的作用是建议使用内联函数,是否使用取决于编译器。

7.关键字auto的使用

C++中的关键字auto是一个具有自动识别变量类型的关键字,修饰变量是可识别变量的类型,也可用于定义变量,下面让我们来了解一下关键词auto。

7.1定义变量

auto可用于直接定义一个变量,但在定义变量时是需要进行初始化的,因为由auto定义的变量,实际上在编译器编译的时候就已经将auto替换为所定义变量的实际类型了。

当使用auto一次定义多个变量时,这些变量的类型必须时相同的,否则,这与编译器在编译时将auto替换为修饰变量的对应内型相联系。

7.2auto与指针、引用

auto也可以用于声明定义一个指针变量,但使用auto*与auto所定义的指针变量类型是一致的,但是在使用auto声明定义引用的时候是一定需要加上&符号的,否则无法识别为引用。

7.3auto与范围for

auto的另一个作用是与范围for一起使用,而范围for是基于一个有范围的集合进行for循环遍历的操作,相对于传统的for循环,范围for的循环遍历不需要指定集合的范围就可以依次自动遍历该集合的全部元素。for循环后的括号由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围

如上图范围for依次将数组中的元素赋值给变量e,遍历打印数组a中的全部元素。

7.4auto的使用局限

auto并不能完全代替变量类型的声明定义,在函数的参数的类型定义,auto就不能够使用,以及对于数组的定义,auto同样也无法使用。

8.空指针nullptr

在C语言中,我们常常使用NULL来表示空指针,但实际上,C语言中的空指针是由宏定义而来的,NULL被使用宏定义为数字0,在某些问题中使用NULL来表示空指针会产生一些意想不到的麻烦,当我们使用cout打印NUL也会发现,NULL被识别为数字0。

而为了解决空指针这一缺陷的缺陷, C++中则引入了nullptr来表示空指针,在以后的空指针的表示中,我们也最好使用nullptr来表示。


结语

作为新的知识的开始,C++的入门相关知识就介绍到这里了,今后也会带来过多有关C++的知识,如果感觉对你有帮助的话还请点个赞支持一下!有不对或者需要改正的地方还请指正,感谢各位的观看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值