GeekBand-secondweek-c++的引用和拷贝

部分资料整理自think in c++
 
1、先说指针
 
c的指针不可以在不同类型间传递,但是void*提供了一种中间的实现方式,c++严格不允许这种方式,需显性使用映射,见chapter18
 
2、讲讲引用
 
引用即别名,引用是与内存单元的挂钩,所以const int &r = 12,仍然合法(关注右值引用);引用创建时,必须和一个已经存在的内存单元挂钩,即引用必须初始化;引用没有赋值概念,即一旦初始化就不能改变引用所对应的内存单元;且引用所对应的必须是合法的内存单元;
 
3、函数中的引用
 
3.1 参数传引用或常量引用:常量引用的话,函数内只能调用对象的常量成员函数,并不可以修改公有成员变量,如果给常量引用参数提供了一个字面值常量的实参,那么字面值常量也必须分配内存,并附以const属性,所以形参声明形式必须是const的;
 
3.2 参数传指针类型的引用:即int *& a;

4、拷贝构造函数
 
4.1 位拷贝
 
一个接收类类型对象参数的函数,当形参创建时并没有按照我们猜想的调用拷贝构造函数,而是采用了按位拷贝的方式复制了实参的内存空间,而销毁形参的时候却调用了析构函数,这隐藏着风险;凡等于号或赋值的初始化地方都采用了这种位拷贝的方式;
 
事实上对传值的操作,编译器认为我们是使用位拷贝来创建对象;
 
4.2 拷贝构造
 
拷贝构造函数由用户实现,这样在传递值时,新的对象会被构造,并拷贝传入者的副本(以浅拷贝为例);
 
临时对象:
假设有这样一段代码:
X x;
int f(X z);
X y = f(x);
 
代码中发生的是:x传入时,z被构造,当返回时,y被构造并被拷贝z的副本;这样整个过程其实构造三次;假设f(x)没有任何接收者,编译器会创建一个临时对象保证接收地址是存在的,并接收z的拷贝,然后z析构,当此临时对象完成类似y的作用后,也立刻被析构;
注意:这个临时对象虽然存在时间的非常短,如果函数作为其它函数的参数使用,也是有返回值接收者的,此时临时对象并没有被创建
 
4.3 缺省的拷贝构造
 
用户未实现拷贝构造时,编译器会默认创建一个拷贝构造函数,但是目前看到的是这种行为就是:位拷贝;

 

posted on 2016-05-22 19:00  执念者勤  阅读(173)  评论(0)    收藏  举报

导航