目录
一、第一个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关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
比如:
命名空间域定义的规则
命名空间的使用
三、C++的输入和输出
用cin>>输入
用cout<<输出 其中endl相当于插⼊⼀个换⾏字符加刷新缓冲区。
连续的输入输出:
当然,分开一行行写也是没有问题的。
IO流涉及很多的知识,对于刚接触C++的入门者来说暂时只需要了解如何输入输出以及如何连续输入输出,等有一定火候再去深入学习。
四、缺省参数
C的缺陷
一个函数如果有参数,但是没有传参的话会导致编译错误,就像这样:
C++的改进
第一次调用没有传参,使用参数默认值,打印了10。
第二次调用传了参数1,因此打印了1。
缺省参数的规则
下面规则别问为什么,问就是祖师爷规定的。
1、可以全缺省也可以半缺省,半缺省的话要从右边开始往左给默认值。
2、调用的时候要从左边开始往右给参数
3、函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
五、函数重载
C的缺陷
函数如果名字相同的话会报错
在C中解决这个问题只有给函数取不同的名字,这样的话浮点数相加和整形数据相加使用的函数名字不同,不够方便。
C++的改进
C++中引入了重载的概念,在函数名相同,但是参数的类型、数量不相同时不会引起编译错误。
这样无论是浮点型的加法还是整形的加法都可以使用Add这个函数名来调用,对程序员来说不用取不同名字,方便很多。
注意,重载只能重参数的类型和数量不同,若只有返回值不同,则无法构成重载,会导致编译错误。
六、引用类型
引用的本质
引用的本质就是别名
这里abcd都是变量a,只是名字不同,通过打印出他们的地址可以证明:
引⽤的特性
引用的使用
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也会被编译器忽略。
八、nullptr
nullptr是C++11中引入的新关键字,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。
在C++中虽然可以使用NULL,但是可能会导致出问题,因此程序员都使用nullptr。