14.2需要new和delete的原因假如构造函数要被调为Tdate用,则必须在进行内存分配的malloc()调用时进行然而malloc()仅仅只是一个函数调用,它没有足够的信息来调用一个构造函数。它所接受的参数是一个unsigned long类型pD从malloc()那儿获得的不过是一个含有非法数据的类对象空间而已,对应的对象空间中的值不确定·为此,须在内存分配之后再进行初始化
• 假如构造函数要被调为Tdate用,则必须在进 行内存分配的malloc()调用时进行。 • 然而malloc()仅仅只是一个函数调用,它没有 足够的信息来调用一个构造函数。 • 它所接受的参数是一个unsigned long类型。 • pD从malloc()那儿获得的不过是一个含有非法 数据的类对象空间而已,对应的对象空间中 的值不确定。 • 为此,须在内存分配之后再进行初始化
14.2需要new和delete的原因例如:下面的代码用malloc()来进行对象的创建void fn ()ITdate * pD;pD = ( Tdate * )malloc(sizeof Tdate ) ;//设置Tdate值pD->SetDate() ;free(pD) ;从根本上说,因为绕过不是一个类对象的创建1了构造函数
例如:下面的代码用malloc( )来进行对象的创建 void fn ( ) { Tdate * pD ; pD = ( Tdate * )malloc( sizeof Tdate ) ; pD->SetDate( ) ; //设置Tdate值 free(pD) ; } • 从根本上说,不是一个类对象的创建,因为绕过 了构造函数
14.2需要new和delete的原因,从程序设计的需要来看,在分配内存申请的时候,总是知道分配的空间派什么用。而且分配空间大小总是某个数据类型(包括类类型)的整数倍。因而C++用new代替c的malloc()是必然的new和delete已经完全覆盖了malloc和free的功能
• 从程序设计的需要来看,在分配内存申请的 时候,总是知道分配的空间派什么用。 • 而且分配空间大小总是某个数据类型(包括 类类型)的整数倍。 • 因而C++用new代替C的malloc()是必然的。 • new和delete已经完全覆盖了malloc和free的功 能
14.3分配堆对象,C++的new和delete机制更简单易懂。例如:代码修改void fn()[Tdate * pS ;分配堆空间并构造它pS = new Tdate;1 /../先析构,然后将空间返还给堆delete pS ;
• C++的new和delete机制更简单易懂。 例如:代码修改 void fn ( ) { Tdate * pS ; pS = new Tdate ; //分配堆空间并构造它 //. delete pS ; //先析构,然后将空间返还给堆 }
分配堆对象14.3不必显式指出从new返回的指针类型,因为new知道要分配对象的类型是Tdate。而且new还必须知道对象的类型,因为它要藉此调用构造函数。如果分配局部对象,则在该局部对象退出作用域时,自动调用析构函数。要么程序执行遇到函数结束标记!要么遇到返回语句
• 不必显式指出从new返回的指针类型,因为 new知道要分配对象的类型是Tdate。 • 而且new还必须知道对象的类型,因为它要 藉此调用构造函数。 • 如果分配局部对象,则在该局部对象退出作 用域时,自动调用析构函数。 ✓ 要么程序执行遇到函数结束标记} ✓ 要么遇到返回语句