(一)函数模板
int I_Max(int a,int b)
{
return a>b?a:b;
}
double D_Max(double a,double b)
{
return a>b?a:b;
}
我们可以看到,上面两段代码的主要功能是相同的(求两个数中的最大值),但是参数类型和返回类型是不同的,为了简化这种代码,就要使得一些相似函数的代码是通用的,它不受数据类型的限制,于是便可以使用函数模板。
template<class T>
T Max(T a, T b)
{
return a > b ? a : b;
}
int main()
{
cout << Max(12.11, 22.12) << endl;
cout << Max('a', 'b') << endl;
return 0;
}
template<class T,class U>
auto Max(T a, U b)
{
cout << typeid(T).name() << endl;
cout << typeid(U).name() << endl;
return a > b ? a : b;
}
int main()
{
cout << Max('a',100) << endl;
return 0;
}
这样,在使用函数时,不必在根据类型来选择对应的函数 ,大大简化了代码。
在编译过程中,系统会根据函数模板的实参构造出独立的函数,称之为:模板函数,这个构造过程被称为:模板实例化。
比如上述代码,当主函数调用时,会根据具体的参数类型,在编译过程中,生成对应Max函数。
(二)名字空间
1.名字空间域
在C++中,有这五种域:全局域、局部域、块域、名字空间域、类域。
在不同程序中,全局实体名很容易引起命名冲突(命名污染),为了解决这种问题,于是便引入了名字空间域。
namespace space_A
{
void fun()
{
cout << "AAA" << endl;
}
}
namespace space_B
{
void fun()
{
cout << "BBB" << endl;
}
namespace space_C
{
void fun()
{
cout<<"CCC"<<endl;
}
}
}
int main()
{
space_A::fun();
space_B::fun();
space_B::space_C::fun();
return 0;
}
这样一个名字空间就定义了一个新的作用域,在使用不同域内的函数时,只需使用 域名::函数名(),使用其它内容时同理。
2.using
(1)使用using引用名字空间内成员
格式:using 名字空间名,这样使用using声明时可以只写一次限定修饰名。
using space_A::fun;
//以后在使用fun时,可以直接使用成员名
int main()
{
fun();
return 0;
}
(2)使用using namespa引入名字空间
格式:using namespace 名字空间名,这样使用可以一次性使名字空间内所有成员被直接使用。
using namespace space_A;
int main()
{
fun();
}
在C++中,最常见到的是这种用法:using namespace std ; 这是因为标准C++库中的所有组件都是在std中声明和定义的。
(三)new和delete
1.new和delete的使用
new和delete是在C++中用于动态内存分配和释放的运算符,new用于在堆上分配内存,并返回一个指向该内存块的指针,delete用于释放由new分配的内存。
int* p = new int(10);
int* q = (int*)malloc(sizeof(int));
delete p;//把p指向的空间还给堆区,
p = NULL;//若不将 p= NULL 则p任然指向堆区(空悬指针)
int* s = new int[4] {1,2,3,4};//申请10个int 空间,依次初始化为1,2,3,4
delete []s;//释放全部空间
执行new的过程,可以看为:1.sizeof(int) 2.调用malloc 3.初始化为(10) 4,返回空间的地址 申请失败不会返回空指针,会直接抛出异常。
2.定位new
定位new是一种特殊的内存分配方式,它允许程序员在已经分配好的内存位置上构造对象。
int* q = (int*)malloc(sizeof(int));
new(q) int(100);//对一块空间初始化
char str[10];
new(str+4) int(10)
3.new和malloc的区别
a.new/delete是C++中的运算符,而malloc和free是函数api。
int* q = (int*)::operator new(sizeof(int));//new的函数调用 申请失败不会返回空指针,会直接抛出异常
b. new在分配内存时,可以进行初始化。malloc只分配内存空间,不可以进行初始化。
c.new申请内存空间时,只需要类型名,自动计算类型大小。malloc需要手动计算。
d.new的返回值在接收时不需要强转。malloc返回值类型为void*,需要强转。
e.new申请失败不会返回空指针,会直接抛出异常,所以需要异常捕获处理程序。malloc失败时会返回NULL,只需判空。

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



