目录
1. C++关键字
如图:简单认识下
2. 命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字 污染,namespace关键字的出现就是针对这种问题的。
1.命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
1.命名空间中的内容,既可以定义变量,也可以定义函数
2. 命名空间可以嵌套
3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
看以下代码理解:
#include<stdio.h>
namespace LF
{
int a = 10;
void test1()
{
printf("hello,world\n");
}
namespace LL
{
int a = 100;
int b = 90;
}
}
void test1()
{
printf("hello,LF\n");
}
int main()
{
int a = 1;
printf("%d\n", a);
test1();
return 0;
}
结果:
1
hello,LF
C:\Users\if\Desktop\world\Project2\Debug\Project2.exe (进程 30672)已退出,代码为 0。
按任意键关闭此窗口. . .
2.命名空间使用
1.加命名空间名称及作用域限定符
printf("%d\n", LF::a);
2.使用using将命名空间中成员引入
using LF::a;
3.使用using namespace 命名空间名称引入
namespace LF
{
int a = 10;
void test1()
{
printf("hello,world\n");
}
namespace LL
{
int a = 100;
int b = 90;
}
}
using namespace LF;//将命名空间引入
int main()
{
int a = 1;
printf("%d\n",a);//,即使将LF展开,依然局部变量优先
printf("%d\n", LF::a);
printf("%d\n", LL::a);//只有展开LF,才可以使用LL;
return 0;
}
结果:
1
10
100
C:\Users\if\Desktop\world\Project2\Debug\Project2.exe (进程 27872)已退出,代码为 0。
按任意键关闭此窗口. . .
3. C++输入&输出
#include<iostream>
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}
结果:Hello world!!!
1.使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。
2. 使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c
int main()
{
int a = 0;
double p = 0;
cin >> a;
cin >> p;
cout << a <<p<< endl;
return 0;
}
4. 缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
全缺省:
void Test(int a = 100,int b=90)
{
cout << a << endl;
cout << b << endl;
}
int main()
{
Test(); // 没有传参时,使用参数的默认值
Test(10); // 传参时,使用指定的实参
}
结果:
100
90
10
90
半缺省:
void TestFunc(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
1. 缺省参数必须从右往左依次来给出,不能间隔着设置缺省参数
2. 缺省参数不能在函数声明和定义中同时出现
注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
3. C语言不支持(编译器不支持)
5.函数重载
1.什么是函数重载
void Func(int a, double b)
{
cout << a << b << endl;
}
void Func(double a, int b)
{
cout << a << b << endl;
}
void Pt(int a)
{
cout << a << endl;
}
void Pt(double a)
{
cout << a << endl;
}
![](https://img-blog.csdnimg.cn/91785013b0684c40b10204a3018f79cf.png)
![](https://img-blog.csdnimg.cn/037c9d508c6d4a89a781e029c1512698.png)
c++编译后的结果:
C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就可以支持重载。
2.extern “C
解释:有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern "C",意思是告诉编译器, 将该函数按照C语言规则来编译。
用法:
第一:添加在函数声明的前面
第二:extern “C”再用花括号将函数声明括起来。
经过上面的函数名修饰规则,我们知道C语言编译的库是没有改函数名的,而C++调用时会修改函数名(把函数参数与函数名结合),当用C++直接调用C库,在链接时,一个修改过的函数名,去符号表里找没被修改过的函数,显然是找不到的,这时会产生链接错误。
C如何调用C++的静态库:extern “C”将C++中的头文件中的函数声明括起来,然后生成c++的库,c语言再去调用这个生成的库,但c语言包含的c++的头文件中有extern “C”,c语言编译器识别不了,因此需要用到条件编译,将c语言包含c++头文件中的extern “C”去除。
例如:
#ifdef __cplusplus
extern "C"
{
#endif
//头文件声明
..........
..........
#ifdef __cplusplus
}
#endif
6.引用
1.概念
int main()
{
int a = 9;
int& p = a;
printf("%d\n", p);
printf("%p\n", &p);
printf("%p\n", &a);
return 0;
}
结果:
9
000000A93B6FF6C4
000000A93B6FF6C4
2.引用特性
1.一个变量可以有多个引用
2.引用在定义时要初始化
3.引用一旦引用一个实体,再不能引用其他实体
3.常引用
1.引用后变量的权限只能缩小,不能够放大
只读变量 不能 引用后变为可读可写变量
2.常量也可以被引用
3.引用也可用于不同的类型数据中
此处要加上const修饰int&p,原因:在类型转换中,不是直接转换的,此处为例(double类型的数据转为int型,是把double类型数据中的整数部分存到一个临时变量中去,临时变量是具有常性的,再把临时变量中的值拷贝到p中)
4.使用的场景
1.做函数的参数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
2.做函数的返回值
int& Count()
{
static int n = 0;
n++;
// ...
return n;
}
注意:传值返回,是将返回值拷贝下来,但传引用返回,函数返回的是返回变量的别名(共用一个地址) 如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
5.传值、传引用效率比较,及二者区别
![](https://img-blog.csdnimg.cn/277135f6ca784d0aa725a8303f616c97.png)
7.内联函数
概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。
在release模式下,查看编译器生成的汇编代码中是否存在call Add
特性:
8.auto关键字(C++11)
1.概念,用法
概括:在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量。C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型 符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
2.auto不能推导的场景
1. auto不能作为函数的参数
void Test(auto a)
{
}
//会报错
void Test()
{
int a[] = {1,2,3,4,5,6};
auto b[] = {4,5,6,7,8};//此语言报错
}
3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
3.基于范围的for循环(C++11)
1. 范围for的语法
auto是取array中的数据,赋值给e,自动判断结束,并没有修改原数组的内容
2.范围for的使用条件
1.范围for迭代的范围必须是确定的
void TestFor(int array[])
{
for(auto& e : array)
cout<< e <<endl;
}
//会报错
2. 迭代的对象要实现++和==的操作