1、属性:malloc() 是库函数,而new是关键字(运算符);
2、位置:使用 malloc() 分配空间在堆中,new 分配的空间在自由存储区;
3、参数:malloc() 分配空间大小由参数确定,new分配空间大小为创建对象大小;
4、返回值:malloc() 返回值为void*类型,new返回值为确定的类型指针(安全);
5、失败:分配失败情况下,malloc() 返回NULL,new会抛出bac_alloc异常;
6、重载:new运算符允许被重载,malloc不能被重载;
7、调用:new运算符会调用类的构造函数,delete会调用类的析构函数;
8、再分配:malloc() 分配内存不足或过多时,可以使用 realloc() 扩充或缩减。
参见: new与malloc区别@ywliao new和malloc区别@Datou_Nie
- 函数作为左值
当且仅当函数返回值为引用类型时,可以使用函数作为左值。其他情况不能作为左值使用。
见下面例子:
#include<stdio.h>
int a[2] = { 1, 2};
int &func( int i) {
return a[i];
}
int main()
{
func( 1) = 10; // 设置a[1]值为10
printf( "a[0] = %d, a[1] = %d\n", a[0], a[1]);
return 0;
}
// output: a[0] = 1, a[1] = 10
- 函数参数设置默认值
c++函数可设置带默认值的参数,且这种参数必须要在不带默认值的参数之后。
有两种方法对其实现:一种是在声明的时候设置参数默认值,一种是在定义的时候设置默认参数。
两种方法可以混合使用,但不能同时设置一个参数的默认值。
#include<stdio.h>
int add( int a, int b=10);
int sub( int a, int b);
int add( int a=12, int b)
{
return a+b;
}
int sub( int a, int b=3)
{
return a-b;
}
int main()
{
printf( "add()=%d\tadd(1)=%d\tadd(1,3)=%d\tsub(4)=%d\t\n", add( ), add( 1), add( 1, 3), sub( 4));
return 0;
}
// output:
// add()=22 add(1)=11 add(1,3)=4 sub(4)=1
另附:c语言参数默认值实现
- sizeof 与 strlen区别
sizeof:sizeof 是运算符,其运算结果在编译时已经确定。因此不会随着数据结构的动态扩充来改变其结果。
strlen:strlen 是一个函数,其参数为char*,返回结果为当前数组空间下字符串的长度。