6.引用
引用:引用即别名,是一个已存在的变量(对象)的另外一个名字。
eg:
int num = 100;
int &rn = num; // rn是num的别名,num和rn指代的是同一个对象。
注:1.声明创建引用的时候不占用存储空间
2.&在此不是求地址运算,而是起标识作用
3.引用和目标变量的地址是一样的,对引用的修改就是对目标变量的修改。
4.类型标识符是指目标变量的类型。引用的类型必须和其所绑定的变量的类型相同
5.引用声明完毕不能再把该引用名作为其他变量名的别名
6.声明引用时,必须同时对其进行初始化。
建立数组的引用:类型 (&引用名)[数组中元素数量]=数组名;
eg:
int arr[10] = {1,2,3,4,5};
int(&a)[10] = arr;// int(&a)[10] = arr;
cout << a[3] << endl;// arr[0] <==> a[0]
用途:用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题(避免产生临时对象)。
eg:void swap(int& a,int& b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int a = 2,b = 3;
cout << a << b << endl;
swap(a,b);
cout << a << b << endl;
}
常引用:引用时用const修饰,则被说明的引用为常引用.常引用所引用的对象不能被更新
const <类型说明符> & <引用名>;
例如:
const int &n;
注意:1.如果返回成员对象引用,一般作为常引用返回
2.不能返回局部变量的引用
3.尽量不要返回函数内部new分配的内存的引用
4.可以返回类成员的引用,但最好是const:保障私有数据的安全
常数据成员:类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化。
eg:Test():类对象{赋值}
{
}
6.1对象实例化
在栈中创建对象:
eg: Test arr[10];
Test是一个类,创建时调用了10次无参构造函数
在堆中创建对象:
eg: 类型 *指针名 = new 类型; //无提供初始默认为0
类型 *指针名 = new 类型(初值);
类型 *指针名 = new 类型{初值};
delete 指针名;
int *p = new int;
int *p1 = new int(1024);
类型 *指针名 = new 类型[元素个数] {初值};
delete[] 指针名;
int *p2 = new int[10] {1,2,3,4,5,6,7,8,9,10};
临时对象:指在函数传参或者函数返回时,临时创建的没有名字的对象,用完后,会立即销毁.
eg:不是临时对象 临时对象
Screen s; Screen s;
Color C; s.setColor(Color{});
s.setColor(C);
问题:
1.C语言中的malloc/free和C++中的new/delete有什么区别!!!
.malloc只分配内存,并不调用对象的构造函数。free也不会调用析构函数
.new操作符分配内存,调用对象的构造函数(如果需要)。delete操作符在释放内存之前会调用对象的析构函数
.malloc:如果内存分配失败,malloc会返回NULL
.new:如果内存分配失败,new会抛出一个std::bad_alloc异常,
.C++new和delete是运算符,因此可以像其他运算符一样被重载
.C语言不支持运算符重载。