C++基础知识
C++的出现是为了补充C语言存在的一些不足,由此我们在C++中需要学习一些新的特性。
1.命名空间
1.域作用限定符 ::(C++中才有的)
样例(注意域作用符 ::使用时,前面有一个空格)
int a = 0;
int main()
{
int a = 1;
//1.访问的是局部变量
printf("%d\n", a);
//2.通过域作用符限定访问全局变量
printf("%d\n", ::a);
return 0;
}
2.命名空间域
- 为什么会提出命名空间域的概念?
命名空间域的提出是为了防止定义变量时发生命名冲突,有时我们定义的一些变量会跟库里面的一些名称相同,此时就会发生冲突,编译器无法识别。
namespace ll
{
int rand = 10;
int x = 20;
}
int main()
{
//此处的rand访问的是库里面的rand变量,打印出来的是一个地址
printf("%p\n", rand);
//这里是访问空间域中的变量
printf("%d\n", ll::rand);
printf("%d\n", ll::x);
}
只有定义在函数里面的才是局部变量
-
命名空间不影响变量的生命周期,影响的是查找规则
命名空间域影响的是编译查找规则,限定查找的域。如果指定了就在指定里面找。
默认查找规则是:现在局部找,再去全局找。 -
域中的变量存在哪?
静态区 -
命名空间中还可以定义函数和类型
namespace ll
{
int Add(int left, int right)
{
return left + right;
}
struct Node
{
int val;
struct Node* next;
};
}
- 命名空间还可以嵌套命名空间
namespace N1
{
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int Sub(int left, int right)
{
return left - right;
}
}
}
int main()
{
//嵌套命名空间的访问方式
N1::N2::Sub(3, 2);
}
- std C++官方库定义的命名空间
#include <iostream>
using namespace std;
//日常练习可以将官方库展开
//项目里面不要这么用
//还可以部分展开(下面会举例),即指定展开
int main()
{
std::cout<<"hello,world"<<std::endl;
cout<<"hello,world"<<endl;
return 0;
}
#include <iostream>
//指定展开方式,常用的展开,自己定义的时候避免根常用的冲突
//在项目里面可以只需常用的展开,自己定义的时候避免跟常用重名即可
using std::cout;
int main()
{
cout<<"hello,world";
return 0;
}
C++允许定义多个同名得命名空间,会自动合并成一个命名空间(将命名空间看成一堵墙)。
好处:该命名空间中需要包含得内容可能很多,分布在多个文件。
2.cout和cin
cout和cin的优点是自动识别类型,因为实现了运算符重载和函数重载。
(此次大概来了解,后续会有补充)
流插入运算符<<
流提取运算符>>
格式化控制一般还是使用printf/scanf
3.缺省参数
全缺省参数,全缺省的调用非常灵活
半缺省参数(部分缺省),只能从左往右连续缺省
注意:传参数只能从左往右依次传,不能将中间空出来
void func(int a = 0)
{
std::cout << a << std::endl;
}
int main()
{
func();
func(10);
return 0;
}
void func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
void func1(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
func(1, 2, 3);
//func(1, , 2); 不支持
func(1, 2);
func1(1);//第一个参数必须要传参
return 0;
}
缺省参数不能在声明和定义里面同时出现,防止出现歧义(编译器不允许)
一般听.h中,即在声明中就要给出缺省值
4.函数重载
函数名相同,参数不同(顺序,个数,类型)
函数重载或者缺省参数可能会引发二义性,调用不明确
void func(int a = 0, char b = 0)
{
cout << a << endl;
cout << b << endl;
}
void func(char a = 0, int b = 0)
{
cout << a << endl;
cout << b << endl;
}
int main()
{
//func(); 函数调用不明确,产生二义性
return 0;
}
5.函数重载的原理(编译原理)
C语言不支持函数重载
C++支持
why???
函数调用本质是call一个地址
符号表里面存着函数名及其函数的地址
由于C++函数名修饰规则不同,C++能够支持函数重载。
返回值不同,能不能构成重载???
为什么不能?
是因为函数名修饰规则没有带返回值吗?
返回值不同,不构成重载的原因,并不是函数名修饰规则,真正原因是调用的二义性,调用时不指定返回值类型