1. const的用法
定义常量时:
const int temp1; //temp1为常量,不可变
int const temp2; //temp2为常量,不可变
修饰指针时:
主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量;
const int *ptr; // *ptr为常量;
int const *ptr; // *ptr为常量;
int* const ptr; // ptr为常量;
const int * const ptr; // *ptr、ptr均为常量;
const修饰类对象时:
const修饰类对象时,其对象中的任何成员都不能被修改。const修饰的对象,该对象的任何非const成员函数都不能调用该对象,因为任何非const成员函数都会有修改成员变量的可能。
class TEMP {
void func1();
void func2() const;
}
const TEMP temp;
temp.func1(); //错误
temp.func2(); //正确
const修饰成员变量:
const修饰的成员变量不能被修改,同时只能在初始化列表中被初始化,因为常量只能被初始化,不能被赋值;赋值是使用新值覆盖旧值构造函数是先为其开辟空间然后为其赋值,不是初始化;而初始化列表开辟空间和初始化是同时完成的,直接给与一个值,所以const成员变量一定要在初始化列表中完成。
class TEMP {
const int val;
TEMP(int x)val(x) {}; //只能在初始化列表中赋值;
};
const修饰类的成员函数
const成员函数表示该成员函数不能修改类对象中的任何非const成员变量。一般const写在函数的后面,形如:void func() const;如果某个成员函数不会修改成员变量,那么最好将其声明为const,因为const成员函数不会对数据进行修改,如果修改,编译器将会报错;
class TEMP {
void func()const; //常成员函数,不能修改对象中的成员变量,也不能调用类中任何非const成员函数;
};
※ mutable关键字:
在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改:
class ST {
public:
int a;
mutable int showCount;
void Show()const;
};
void ST::Show()const
{
//a=1; //错误,不能在const成员函数中修改普通变量
showCount++;//正确
}
2. new与malloc的区别:
- new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配。
- new返回的时指定对象的指针,而malloc返回的时void*,因此,malloc的返回值一般都需要进行类型转换。
- new不仅分配一段内存,而且还会调用构造函数,而malloc不会。
- new分配的内存需要用delete销毁,malloc要用free来销毁;delete销毁的时候回调用对象的析构函数,而free则不会。
- new是一个操作符,可以重载,malloc是一个库函数。
- malloc分配的内存不够时,可以通过realloc扩容。new没有这样的操作。
- new如果分配失败了就会抛出bad_malloc的异常,而malloc失败了则会返回NULL。
- 申请数组时:new[]一次分配所有的内存,多次调用构造函数,搭配使用delete[],delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int)*n。