C++ :二、C++中的基础小点

(一)函数模板 

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,只需判空。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值