C++初接触

目录

一、第一个C++程序 

二、命名空间

C的缺陷

C++的改进

命名空间域定义的规则

命名空间的使用

三、C++的输入和输出

四、缺省参数

C的缺陷

C++的改进

缺省参数的规则

五、函数重载

C的缺陷

C++的改进

六、引用类型

引用的本质

引⽤的特性

引用的使用


一、第一个C++程序 

与其他语言一样,很多入门书籍中的第一个C++程序便是通过代码在屏幕上打印出"Hello world!"。代码及效果如下图:

由于C++兼容C,所以如果使用C中的printf来打印"Hello world!"也是可以的,但是大多数使用C++的程序员都习惯使用C++中的语法打印,大多数情况下都不使用C中的printf。

第一行代码#include<iostream>:iostream是C++标准中为我们提供的库,包含了这个库后就可以使用库中已经写好的输入输出对象。

第二行代码:main函数,提供程序的入口。

二、命名空间

要知道第一个C++程序中的"std::"是什么意思,要先弄懂什么是命名空间。

我们知道,C++是对C的继承和发展,C++中的命名空间便是对C缺陷的完善。

C的缺陷

一个项目常常是由多个程序员合作完成的,这多个程序员命名的变量可能会重名,这样就会导致单个程序员在自己电脑上测试的时候代码是没问题的,而把代码合并到一起就会由于变量重名而导致编译错误,后续处理起来非常麻烦。

C++的改进

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

比如:

namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以 上图的代码中编译没有报错。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的声明周期,命名空间域和类域不影响变量声明周期。
命名空间域定义的规则
1、 namespace只能定义在全局,当然他还可以嵌套定义。下图为嵌套定义的例子:
2、项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。比如:如果函数的定义和声明在不同的文件中,这两个文件都可以定义名字相同的命名空间,编译器会认为这是同一个命名空间。
3、C++标准库都放在⼀个叫std(standard)的命名空间中。
命名空间的使用
1、使用::(命名空间作用域符)访问:
这里就使用了::操作符访问了hi中zgs中的a变量,::的左边是域名,右边是域中的变量名(这里如果::左边没有参数,默认访问的是全局域中的变量)。
2、用using将命名空间中的某个成员展开:
3、将命名空间整个展开:
现在就可以回答"std::"是什么意思这个问题了,因为 C++标准库都放在⼀个叫std(standard)的命名空间中,要使用标准库中的对象,要使用"std::"对标准库所在的命名空间进行访问。当然也可以用其他方法使用命名空间。

三、C++的输入和输出

用cin>>输入

用cout<<输出   其中endl相当于插⼊⼀个换⾏字符加刷新缓冲区。

连续的输入输出:

当然,分开一行行写也是没有问题的。

IO流涉及很多的知识,对于刚接触C++的入门者来说暂时只需要了解如何输入输出以及如何连续输入输出,等有一定火候再去深入学习。

四、缺省参数

C的缺陷

一个函数如果有参数,但是没有传参的话会导致编译错误,就像这样:

C++的改进

第一次调用没有传参,使用参数默认值,打印了10。

第二次调用传了参数1,因此打印了1。

缺省参数的规则

下面规则别问为什么,问就是祖师爷规定的。

1、可以全缺省也可以半缺省,半缺省的话要从右边开始往左给默认值。

2、调用的时候要从左边开始往右给参数

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

五、函数重载

C的缺陷

函数如果名字相同的话会报错

在C中解决这个问题只有给函数取不同的名字,这样的话浮点数相加和整形数据相加使用的函数名字不同,不够方便。

C++的改进

C++中引入了重载的概念,在函数名相同,但是参数的类型、数量不相同时不会引起编译错误。

这样无论是浮点型的加法还是整形的加法都可以使用Add这个函数名来调用,对程序员来说不用取不同名字,方便很多。

注意,重载只能重参数的类型和数量不同,若只有返回值不同,则无法构成重载,会导致编译错误。

六、引用类型

引用的本质

引用的本质就是别名

这里abcd都是变量a,只是名字不同,通过打印出他们的地址可以证明:

引⽤的特性
1、 引⽤在定义时必须初始化
2、 ⼀个变量可以有多个引⽤
3、引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
引用的使用
引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象(引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些)。
在C中交换两个变量的写法:
在C++中支持的另一种写法:
这里的x就是a,y就是b,因此交换不用传指针,使用起来更加方便。
Const 引用

带有const的引用可以引用const对象,也可以引用没有const的对象,但是const对象不能用不带const的引用引用,因为对象的访问权限在引⽤过程中可以缩⼩,但是不能放⼤。

像上图中的引用像2*a的结果会保持在一个临时对象中,而C++中规定临时对象具有常性(只能读不能写),

int& rd = d;

也是类似,所以像让代码编译通过要在前面加个const

这样就没问题了。

指针和引用的关系

1、语法概念上引用是一个变量的别名,不开空间,而指针存储的是变量的地址,要开空间

2、引用在定义时要初始化,而指针在定义时虽然建议初始化,但是不初始化的话编译也不会报错

3、指针可以改变指向的对象,而引用不能改变引用的对象

4、引用可以直接访问对象,而指针要解引用才能访问对象

5、sizeof中的引用是引用类型的大小,指针是一个地址的大小

6、引用相对指针更为安全

7、底层来说引用也是指针

七、inline

1、⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率。

2、inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

3、 C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调 试,C++设计了inline⽬的就是替代C的宏函数。
4、为了方便调试, vs编译器 debug版本下⾯默认是不展开inline的。
5、inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。

八、nullptr

nullptr是C++11中引入的新关键字,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。

在C++中虽然可以使用NULL,但是可能会导致出问题,因此程序员都使用nullptr。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值