提示:以下是本篇文章正文内容,下面案例可供参考
一、using namespace std是什么?
(1)std C++官方命名的空间,cout和cin就是这个 空间里面的函数,简单来说就是输入输出
(2)namespace std 没有使用using就不可以像全局变量一样,使用它使用必须加上::作用域符号才可以使用。可以理解为有个空间叫std,std里面有库函数之类的,就好比一堵墙,using就是用来打破这面墙把它变成全局域,然后可以任意使用里面的东西。没有这个或者又没有指定作用域,编译器就会找不到这个东西了。
二、使用命名空间namespace
1.C++为什么要使用这个
1.弥补c语言的缺陷,解决我们写的函数和库里面的函数冲突,还有互相冲突。
定义一个rand,打印rand .不过rand提示重定义,因为库函数中也有rand()函数,rand是函数名,打印rand,编译器不知道是哪个rand.这时候就可以用namespace
#include<iostream>
#include<stdlib.h>
int rand = 0;
int main()
{
printf("%d\n", rand);
return 0;
}
解决:namespace + 空间名(自定义)
namespace ljh
{
int rand= 0;
}
int main()
{
printf("%d\n", ljh::rand);//::是作用域符,表示rand是空间ljh里面的rand
return 0;
}
2.namespace的使用
(1)支持嵌套
如果我们自己命名空间里,想要有相同的变量名,避免冲突就可以使用嵌套
namespace lll
{
int b = 9;
namespace jjj
{
int b = 12;
}
}
//访问b =9 lll::b , b=12 lll::jjj::b
3.使用using
将空间内的东西变成全局作用域或者将局部的暴露出来,就像全局变量一样
1.自己测试可以使用using namespace std;
using namespace std;
int main()
{
int a = 12;
float b = 12.8;
int c = 0;
printf("%d %f\n", a, b);//需要指定打印格式
cout << a << endl << b<<endl;//自动识别打印格式
cin >> a;
cout << a;
return 0;
}
2.一个项目工程中不推荐使用using namespace std;需要什么就将它变成全局域,这样每次使用就可以不指定作用域
cout是输出,cout可以识别打印格式,不像c语言打印要指定格式,顺序可以理解为是最左边那个依次输出
cin是可以对多个变量,进行输入。cin
endl就是换行符,和“\n”差不多。
using std::cout;
using std::cin;
using std::endl;
int main()
{
int a = 12;
float b = 12.8;
int c = 0;
printf("%d %f\n", a, b);//需要指定打印格式,C++中也是兼容c
cout << a << endl << b<<endl;//自动识别打印格式
cin >> a;
cout << a;
return 0;
}
4.注意点
如果我们在不同文件或者同一个文件下 使用的空间相同的(空间名),编译器会把它看作同一个空间里面的东西。
三.函数重载
简单来说就是在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
四,C++中的输入输出(cout,cin)
1.cout
cout是c++std空间的输出函数,使用它必须using namespace std;或者局部将cout暴露出来成为全局域using namespace std::cout.它可以自动判断输出数据的类型,<<符号是输出流
2.cin
cin和cout差不多,一个是输出,一个是输入,>>是流提取,比c语言的scanf()好用,不用指定输入数据的格式
五,缺省参数
缺省参数就是调用函数的时候可以缺少参数,缺少的那个参数实际在函数定义的时候已经有了。不过缺省参数要从右边开始缺省。
1.全省和半缺省
全省:就是调用函数时,不写实参,在函数定义的时候实参已经给了
半缺省:缺省应该从右边开始缺省,不可以跳着给例如:test(int a,int b=2,int c)
2.缺省参数的定义和申明如果是分开的不可以在一起出现会出现歧义 ,但是是可以同时给
六.引用&
1.引用是啥
引用就是取别名,它不会开辟空间(底层是靠指针实现的),指向的是同一个被引用的对象。可以理解为我们两个是同一个人。引用和指针比较像,但是二者之间差别比较大
2.引用使用规则
引用的使用规则:引用必须初始化,引用完就不可以改变引用的对象。
1.1引用作为函数参数
1.2引用作为函数的返回值类型
//引用
int& test1(int a1, int b1)//返回值,如果函数结束这个变量空间还没有被收回可以正常使用,如果
//收
{
static int b= 9;
int j = 9;
//return j;
return b;
}
void test2(int& a, int& b)//交换a,b的值,与传地址改变实参相同
{
int c = a;
a = b;
b = c;
}
3.引用和指针的主要区别
1.引用不用开辟空间,而指针变量是需要开辟的
2.引用完对象引用就不可以改变,而指针变量可以初始化
3.引用需要初始化,指针不初始化也可以(野指针)
4。引用自身操作就是引用对象的操作,指针需要解引用
5.引用的类型大小是实体的类型大小,而指针的大小是不变的即使指针类型不同
4.引用的权限
引用的权限不可放大但是可以缩小或平移
//缩小,如果没有加const,b的权限是可以改变a的大小,加上const就让b改变不了c了
int a = 9;
const int& b = a;
//平移,c不可以改变,c的别名b2的值也不可以改变。
const int c = 2;
const int& b2 = c;
//不可以扩大,d的值是不可以改变的
const int d = 3;
int& b3 = d;错误,如果这样写就表示可以通过改变b3来改变d,这明显错误(const已经修饰了d)
七.内联函数
1.什么是内联
内联函数就是在函数声明前加个inline关键字,调用该函数编译器会在编译阶段将该函数展开,不进行普通函数进行栈帧的创建。
2.使用内联的注意点
1.并不是所有函数适合声明内联包括递归之类的,代码短的函数可声明为内联函数可提高效率,过长代码的函数编译器可能不支持它是内联即使已经被声明为内联。
2.内联函数的声明和定义最好放在同一个文件中,因为内联函数不在符号表,链接阶段会出错。
八.auto关键字
1.auto是什么
auto关键字可以理解为一个类型占位符,使用它必须先给他赋值,因为编译器在编译它的时候会根据赋值或者表达式推断出变量的类型。例如auto a=7,在编译阶段由于7是整型,auto就替换成了int.
int a=7.
2.auto的使用规则
1.与指针和引用结合使用
声明指针类型auto和auto*两者没有差别,引用的话必须有&
int main()
{
int a = 0;
auto c = 'a';
auto *b = &a;
auto d = &a;
cout << typeid(a).name() << endl;//typeid可以判断类型
cout << typeid(c).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
2.auto定义多个变量
多个变量的类型要相同,因为编译器只会判断最前面的数据类型,然后默认后面的变量都是这个数据类型
3.auto不可作为函数形参,可用于返回值类型(不建议)
//如果没有使用这个函数,编译器不能判断a的数据类型,就会报错。另一个角度来看,如果库函数有
//参数有auto修饰,我们使用函数必须知道返回值类型,参数列表,没有文档说明,我们是不容易知道的
void fun(auto a)
{
return 0;
}
auto fun2(int a)//如果我们定义一个变量来接收这个返回值,但是我们如果没有查看该函数中返回的值类型,我们也就不知道要用说明类型的变量接收它。
{
int n=0;
return n;
}
4.auto不可以直接声明数组
九.基于范围的for循环(C++11)
我们以前学习C语言如果用for循环遍历数组,我们需要知道数组的长度,如果不注意容易越界
在c++中我们可以用范围for循环直接遍历数组,它自己会知道遍历数组开始与结束。我们称为语法糖
1.语法
for循环后的括号由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围。既然是个for循环,我们也可以用continu/break控制循环。
2.注意
arr是表示这个数组,在数组传参中实际传的是地址,我们不可以这样函数传数组然后用auto使用
十.空指针null和nullptr
int*p=NULL;
int*p=0;
null空指针,在c语言中实际是宏定义,它既被定义成整数0或者是无类型的指针0
#define NULL 0
#define NULL ((void *)0)
这会出麻烦。c++用nullprt解决这个问题
void fun2(int*p)
{
return ;
}
void fun2(int p)
{
return ;
}
int main()
{
fun2(NULL);//如果我们要使用fun2(int* p),但是NULL在预编译阶段替换成0,0被默认成int类型,就默认调用参数为整型的那个函数
fun2(NULL);
fun2((int*)(NULL))//需要使用指针类型参数函数就要强转,但是c++使用了另一个(nullprt)
fun2(nullptr);
}