命名空间
功能:
解决符号名称冲突的方法
语法:
namespace <命名空间名称>
{
//代码
}
使用:
局部引用:
**<命名空间名字> :: <函数名/变量名/类名>**
全部引用:
引用整个命名空间的内容:
**using namespace <命名空间的名字>;**
引用命名空间内单个元素符号:
**using <命名空间的名字> :: <命名空间内元素符号>**
::
域操作符,用于访问作用域
#include <iostream>
using namespace std;
namespace mySpace
{
int a = 10;
}
int main()
{
int a = 20;
cout << "a = " << a << endl; //20
cout << "mySpace::a = " << mySpace::a << endl; //10
return 0;
}
命名空间取别名:
一个命名空间可以取多个别名,使用别名和原名无任何区别
namespace mySpace
{
int a;
}
namespace mySpace2 = mySpce;
匿名命名空间:
定义自己的命名空间时不需要取名字,可以直接使用里面的函数或者变量,但只在当前文件内生效
#include <iostream>
namespace mySpace
{
int a = 10;
}
namespace
{
int a = 50;
}
int main()
{
cout << "a = " << a << endl; //50
cout << "mySpace::a = " << mySpace::a << endl; //10
return 0;
}
using:
功能一:
using namespace 将一个命名空间中的所有名词导入到当前作用域中,从而可以直接使用该命名空间中的所有名称吗,而不必使用作用域解析运算符(::)
#include <iostream>
namespace mySpace
{
int a = 10;
}
int main()
{
using namespace mySpace;
cout << "a = " << a << endl; //10
return 0;
}
功能二:
**定义别名**
**using INT = int** <==> tyepdef int INT;
C++输入输出
C++中输入输出通过流的方式来实现
流运算符:
**<<** 输出运算符
**>>** 输入运算符
定义:
//cin = control-in
cin 标准输入对象:
输入类型不匹配会返回空
消除了scanf连续输入多次字符时产生垃圾字符的缺点
//cout = control-out
cout 标准输出对象
设置域宽:cout.width(5),设置域宽为5
cout输出顺序从左往右,运算顺序从右往左(右边的先算,最后打印)
endl 换行操作
设置域宽:
cout.width(5),设置域宽为5
标准设置:
oct 八进制
hex 十六进制
dec 十进制
showbase 显示前缀
使用cin和cout注意点:
需要包含iostreanm头文件
引用标准命名空间std
#include <iostream>
using namespace std;
int main(int argc, const char *argv[])
{
int a = 0, b = 0;
cin >> a >> b;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//cout.width(5);
cout << showbase;
cout << oct;
cout << "a = " << a << endl;
cout << hex;
cout << "a = " << a << endl;
cout << dec;
cout << "a = " << a << endl;
return 0;
}
cout的执行顺序和输出顺序
cout执行顺序:从右往左执行
cout输出顺序:从左往右执行
C++函数
带默认值的函数
定义:
C++中存在带默认值的函数,即使不传参也会按默认值参数运行
规则:
1、需要添加默认值的参数直接在参数栏中用等号赋值即可
2、可以所有参数都存在默认值,也可以部分参数设为默认值
3、**只有部分参数有默认值时,带默认值的参数必须放在参数栏末尾**
4、实参和形参的传参是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提
5、**默认参数只需要在声明或定义时说明,不需要两者都说明**
带占位参数的函数
定义:
C++中的函数的参数列表可以有占位参数,用来占位,调用函数时必须填补该位置
规则:
只写类型不写变量名
若无默认值参数,则调用时必须填补
若有默认值参数,则调用时可以不用填补
#include <iostream>
using namespace std;
//show_fun_1是带默认值的参数
//参数c的默认值是100
void show_fun_1(int a, int b, int c = 100);
void show_fun_1(int a, int b, int c)
{
cout << a << endl << b << endl
<< c << endl;
}
//show_fun_2是带占位符的函数
//如果没默认值,需要传递第三个参数
//有默认值,不需要传递第三个参数
void show_fun_2(int a, int b, int)
{
cout << a << endl << b << endl;
}
int main(int argc, char const *argv[])
{
int data1 = 10, data2 = 20;
show_fun_1(data1, data2);
show_fun_2(data1, data2, 300);
return 0;
}
函数的重载
定义:
在同一作用域内,参数列表不同,函数名相同的函数。
虽然函数名相同,但函数所在内存位置不同,本质上还是不同函数
规则:
1、函数名称必须相同
2、参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)
3、函数的返回类型可以相同也可以不相同
4、仅仅返回类型不同不足以成为函数的重载的依据
原理:
在编译阶段函数会被重新命名,根据函数名、参数列表来决定,比如void Swap(int &a, int &b)在编译阶段的名称为_Swap_int_int
注意事项:
避免与带有默认值的函数进行重载
C++引用
左值:可以取地址的值
右值:不可以取地址的值
int a = 10;
a ---> 左值
&a ---> 右值
左值的引用:
定义:(取别名)
引用变量是一个别名,也就是说,它是某个已存变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量
引用和指针的区别:
1、不存在空引用。引用必须连接到一块合法的内存
2、一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象
3、引用必须在创建时被初始化。指针可以在任何时间被初始化
规则:
<类型>&<引用名> = 目标名
引用必须在创建时被初始化,且初始化后不可以指向其他目标名(**const**)
引用类型必须与目标类型一致
不能将已有的引用名作为其他变量或对象的名字或别名
原理:
使用引用时编译器会在底层生产一个指针,并进行*运算
本质时指针常量的使用**int *const p**
const int * const p = &a;
顶层const --> p
底层const --> *p
用法:
函数传参:
函数返回值:返回的数据不可为局部变量
#include <iostream>
using namespace std;
int &Swap(int &a, int &b)
{
static int sum = a + b;
int temp = a;
a = b;
b = temp;
return sum;
}
int main(int argc, const char *argv[])
{
int a, b;
cin >> a >> b;
Swap(a, b);
cout << "a : " << a << endl
<< "b : " << b << endl;
int &ret = Swap(a, b);
cout << "ret : " << ret << endl;
return 0;
}
对数组引用:
int arr[5] = {1, 2, 3, 4, 5};
int (&refArr)[5] = arr;
refArr[0] = 6;
cout << "arr[0] : " << arr[0] << endl;
对指针引用:
int num = 100;
int *ptr = #
int *&refPtr = ptr;
*refPtr = 200;
cout << "num : " << num << endl;
右值引用:
定义:
右值引用必须立即进行初始化操作,且只能使用右值进行初始化,当其被初始化过后,在当前作用域内被定义为左值
int a = 3;
int &&b = 3;
b = 100;
函数的重载
定义:
在同一个作用域内,参数列表不用,函数名相同的函数
虽然函数名相同,但函数所在内存位置不同,本质上还是不同函数
规则:
1、函数名必须相同
2、参数列表必须不同(个数不同,类型不同,参数排队不同等)
3、函数的返回类型可以相同也可以不相同
4、仅仅返回类型不同不足以成为函数的重载的依据
原理:
//反编译
g++ -S xx.cpp
在xx.s文件中找 .type
注意点:
避免与带有默认值的函数进行重载
nullptr :替代NULL,能够隐式转换成任何指针或成员指针的类型,也能和他们进行相等或者不等的比较 ---> c++11新特性
NULL存在问题:
(void *)0 <==> NULL
万能引用既可以接收左值由可以接收右值
左值引用只能接收左值,如果要接收右值必须使用常量左值引用
右值引用只能接收右值
new和delete
是操作符,不需要()
new:申请一个对象
delete:销毁一个对象
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int *pa = new int(100);
int *parray = new int [5]{1, 2, 3, 4, 5};
cout << *pa << endl;
int *pb = new int (200);
cout << *pb << endl;
cout << *pb << endl;
cout << parray[1] << endl;
delete pb;
delete pa;
pa = NULL;
pb = NULL;
delete parray;
return 0;
}
new delete 和 malloc free区别
1、new/delete的实现是基于malloc/free
2、malloc/free是C/C++标准库函数,new/delete是C++操作符
3、malloc/free需要手动计算类型大小,且返回void*,new/delete可以自己计算类型大小,根据类型返回相应的类型的指针
4、malloc/free只负责分配/释放空间,new/delete会调用构造函数与析构函数,用于初始化对象与销毁对象
5、它们都是动态管理内存的入口,堆是一块具体区域内存,而自由存量区是一个抽象概念
列表初始化(c11新特性)
功能:
主要用于统一初始化语法
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值替代
顶层const和底层const
顶层const:表示指针本身是一个常量
底层const:表示指针所指的对象是一个常量
898

被折叠的 条评论
为什么被折叠?



