🍉内容专栏:【C/C++要打好基础啊】
🍉本文脉络:1.命名空间;2. .c/.cpp输入输出流3.缺省参数;4.函数重载;5.引用;6.auto;7.范围for
🍉本文作者:Melon西西
🍉发布时间 :2023.1.28
目录
1.1.用namespace定义了一个叫apple的命名空间—域(::叫域作用限定符)
(1)namespace里的还是全局变量,放到静态区,仅仅是隔离的作用
(4)同一个工程里允许存在多个相同的命名空间,编译器会把它们合在一起
(1)使用命名空间名称及域限定符 : : (如上面代码所示)
1.命名冲突问题——命名空间
可能出现哪些冲突呢:自己命名的函数和库里面重名冲突;多人协作命名冲突。
cpp提出一个新的语法,命名空间——namespace;
1.1.用namespace定义了一个叫apple的命名空间—域(::叫域作用限定符)
(1)namespace里的还是全局变量,放到静态区,仅仅是隔离的作用
namespace apple
{
int a = 5;
a=8;//这行是错的,不可以在这里修改赋值
}
int main()
{
int a =10;
cout<<a<<endl; //这个输出的apple=10 ;
cout<<apple::a<<endl; //这个输出的apple=5 ;
apple::a = 8 ; //这样是对的,可以在这里修改值;
rerturn 0;
}
(2)命名空间中可以定义变量,函数,类型(如结构体)
namespace apple{ }
int main()
{
apple :: QIUHE(1,2);//函数
apple :: a; //变量
struct apple :: Student stu1;//结构体
return 0;
}
(3)命名空间可以嵌套定义
namespace apple
{
int a = 8;
namespace banana
{
int a = 10;
}
}
int main()
{
appple::a = 80;
apple::banana::a = 100;
return 0;
}
(4)同一个工程里允许存在多个相同的命名空间,编译器会把它们合在一起
1.2.命名空间的使用
(1)使用命名空间名称及域限定符 : : (如上面代码所示)
指定作用域,做到最好的命名隔离,但是使用不方便。(常用)
(2)使用using将命名空间中某个成员引入
单独展开某一个常用的,其他的不展开 (常用):using apple :: a ;
(3)使用using namespace 命名空间名称引入
把整个命名空间展开(慎用): using namespace apple;
全部展开,用起来方便,但是隔离失效了。
using namespace std ; std:C++库的实现定义在一个叫std的命名空间中
不用上面的可以指定命名空间把常用的展开 :
std : :cout<<" " <<std : : endl; == using std : : cout; == using std : : endl;
2.输入输出流
# include <iostream> 输入输出流
C++和C的输入输出流可以混在一起写(必须是.cpp)
struct Student { char name[20]; int age; }; int main() { struct Strutc stu1={ "西西",20 }; }
分别用.cpp和.c的输出流输出stu1的信息 (各有优势)
cout << "姓名:" << stu1. name << endl;
cout << "年龄:" << stu1. age << endl;
printf ( "姓名:%s\n年龄:%d\n",s.name,s.age);
3.缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。
声明和定义的缺省值不能不同。
再调用这个函数的时候,如果没有指定实参就用这个值,有就用指定的实参。
全缺省参数:全用的缺省值。后三个半缺省参数。
给缺省值只能从左往右给,不可跳过a给b赋值。
4.函数重载
C++允许在同一作用域声明几个功能类似的同名函数。
这些同名函数的形参列表(参数个数,类型,顺序)不同即可。
返回值不同不能构成重载函数,看的是参数。
5.引用
5.1.引用概念:
引用相当于给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量公用同一块内存空间。
5.2.引用特征:&引用变量名(对象名)=引用实体
int a = 5; int &b = a; (这是引用)
int *p = &a; (这是取地址)
引用没有开辟新的空间,而是给原来a的空间取了一个新名字叫b。
引用注意:
引用在定义时必须初始化;
一个变量可以有多个引用;
引用一旦引用一个实体,就不能再引用其他实体,但是可以进行赋值等操作。
5.3引用在函数中的使用和常引用
void swap(int &r1,int &r2) { int temp = r1; r1 = r2; r2 = r1; } int main() { int x = 2,y =3 ; swap( &x , &y ); return 0; }
注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
5.4.指针和引用的区别
因为指针很灵活,所以相对而言引用更安全
6.auto变量
auto可以推到和推导变量类型;
C++可以用cout<<typrid().name() ; 来打印变量类型
int a = 0;
int b = 0;
auto c = a; //自动推到c的类型是a的int
auto d = 'B' ; //自动推导d的类型是char
auto e = 23.45; //自动推导e的类型是double
//C++打团变量的类型
cout<<typrid(c).name(); //int
cout<<typrid(d).name(); //char
cout<<typrid(e).name(); //double
7.范围for(语法糖)
举例:1.打印数组arr
int arr [ ]={1,2,3,4,5,6};
//C/C++遍历数组
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
cout<< arr[i] <<" ";
}
//C++范围for
for(auto x : arr) //常用auto
{
cout<< x <<" ";
}
for(int y : arr) //这样也可以
{
cout<< y <<" ";
}
后两种都可,会自动一次取数组arr中的每个元素赋值给x(y),也会自动判断结束
举例:2.用范围for把数组的每个值+1
int arr [ ]={1,2,3,4,5,6};
for(auto &x : arr)
{
x++
}
for(auto x : arr)
{
cout<<x<<endl;
}
写在最后: