命名空间
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染。namespace关键字可以解决这种问题。namespace本质是定义出⼀个域,这个域跟全局域隔离(因此不能定义在局部中),不同的域可以定义同名变量。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/
类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响
编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。域作用限定符::(当::左边为空的就是全局变量)。
#include <stdio.h>
#include <stdlib.h>
namespace QY
{
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
int main()
{
// 这⾥默认是访问的是全局的rand函数指针
printf("%p\n", rand);
// 这⾥指定bit命名空间中的rand
printf("%d\n", bit::rand);
return 0;
}
命名空间的使用
一般对变量进行访问首先会在局部变量进行访问若没有就会前去全局变量中寻找。使用using namespace +命名空间名字就会现在局部找,没找到去全局,还没找到就去命名空间域找(这种情况适用于不存在冲突的成员访问)。展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,日常练习可以使用这种方式。当使用命名空间域的某一个变量较多的时候可以使用“不完全展开”比如:命名空间域的名字+::变量(QY::a)。
#include<stdio.h>
namespace QY
{
int a = 0;
int b = 1;
}
//对命名空间进行全展开
//这种情况适用于没有访问冲突的情况下
using namespce QY;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
C++输入输出
<iostream> 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输
出对象。
std::cin是istream类的对象,主要面向标准输入流。
std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。 <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)。
补充点:c++中的输入输出会自动识别类型,自动进行转换,此外因为c++是对C语言的补充所以输入输出可以进行混合使用。
#include <iostream>
using namespace std;
int main() {
int a = 0;
double b = 0.1;
char c = 'x';
//命名空间全展开的情况下可以用这种表达方式
cout << a << " " << b << " " << c << endl;
//一般情况下的表示方式
// 可以自动识别变量的类型
std::cout << a << " " << b << " " << c << std::endl;
//输入,类似于scanf不过C++的这种输入不能确保精度
cin >> b >> c;
//打印
cout << b << " " << c << endl;
return 0;
}
缺省参数
缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。带缺省参数的函数调⽤,函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。
#include <iostream>
using namespace std;
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func1();
Func1(1);
Func1(1,2);
Func1(1,2,3);
Func2(100);
Func2(100, 200);
Func2(100, 200, 300);
return 0;
}
函数重载
函数名相同只是函数重载的条件之一,重载函数必须参数列表有所不同(包括参数类型和参数个数)重载函数不依靠返回值来区分,所以返回值可以相同。
引用
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。表示方式:类型& 引⽤别名 = 引⽤对象。typedefy与引用的区别:typedefy是用来对数据类型进行取别名的,引用是给变量取别名。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
//此时b是a的别名,然后c赋值给b,a和b的值都发生改变变为c的值
int c = 20;
b = c;
cout << "a="<<a << endl;
cout << "b="<<b << endl;
cout << "c="<<c<< endl;
return 0;
}
总结
学习C++需要掌握基本语法、面向对象编程、标准库等知识,同时需要不断练习编写代码和参与实际项目,我们要进行大量的练习和知识点语法的记忆。最后希望各位大佬进行指正,你们的三连(点赞,收藏,关注)是我创作的动力。