1、引用
成都创新互联公司是一家专业提供定陶企业网站建设,专注与成都网站设计、成都网站建设、H5技术、小程序制作等业务。10年已为定陶众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。C++中有一种新的数据类型,对已开辟空间在取一个名字;
就是别名,不开辟新的空间,没有空引用;
例:int &b; 错误,
交换两个数字用引用实现:
常见的几种引用形式:
(1)、对变量引用:int a = 10;
int &b = a;
(2)、对指针引用:int *p = &a;
int *&q = p;
(3)、对数组引用:int ar[3] = {1, 2, 3,};
int (&b)[3] = ar;
此外还有以下类型的引用:
(1)、常引用 const int x = 100;
int &y = x; 错的,非常量的不能引用常量,只有自己也加上const成为常量才可以引用。
常量只能常引用;
(2)、int n = 20;
const int &m = n; 对的,常量引用非常量可以,因为你可以改变,我要求自己不能改变而已!
变量也可以常引用;
(3)、 const double d = 12.34;
const int &f = d; 对的,此时d和f由于不是同一种数据类型,所以地址不一样,此时f引用的不是真实的d,而是对产生的临时变量的引用(此时会把整数截取);
(4)、double d = 12.34;
int &f = d; 错的,临时变量一般都具备常量的性质,我们往往在类型转换时所产生的中间临时变量具备常量的性质;所以要加const,对常量的引用,
加上const后,常引用对常量,因为中间的临时变量都是常量(在类型转换时会产生中间的临时变量);只要类型不同,就都会转换;
2、拷贝构造函数
(1)、对象初始化对象,调用拷贝构造函数。
Test(const Test &t){}
因为拷贝构造函数也是构造函数,所以和类名相同。
const只是为了保护t不被更改;
&必须加上,因为 Test t(t1);此时相当于t1给t初始化,调用拷贝构造函数,将陷入无穷的递归当中,所以要使用引用;
(2)、拷贝构造函数系统会有默认的,按其成员进行拷贝!
(3)、调用拷贝构造函数的三种场合:
a、初始化对象时,Test t(t1); 和 Test t = t1;
b、形参实参传递时
c、返回值为对象时,会创建一个无名的临时变量,(此时相当于对象给对象赋值),返回的是一个新的匿名对象;
3、赋值语句
赋值语句系统也有默认的,是各成员之间相互赋值。
void operator=(const Test t);
赋值语句在对象赋值时调用,可以说是对=的重载;
此时const只是为了保护不被修改,t调用拷贝构造函数(对象给对象初始化赋值),但是为了时间和空间的效率,此处用引用更好;
void operator=(const Test &t);
此时不能连等赋值,t = t1 = t2; 这个的本质就是:t.operator=(t1.operator=(t2));
所以的有返回值呀,
Test& operator=(const Test &t){ if(this != &t){ data = t.data; } return *this; }
因为不是创建临时无名对象,所以可以引用返回;临时的不行,返回时空间就已经析构了。
适用场合:Test t; t = t1 =t2 = t3;(对象已经初始化过了,此时就叫做赋值);
4、函数的优化调用:
#includeusing namespace std; class Test{ public: Test(int d = 0) : data(d){ cout<<"Create Test Object"< 优化以上的代码,使节省空间和时间:
Test fun(Test &x){ int value = x.GetData(); return Test(value); //创建临时无名对象,编译器直接认为:直接就是这个t2对象 } int main(void){ Test t1(100); //创建对象t1 Test t2 = fun(t1); //不用再调用赋值语句; return 0; }效率最低-->代码的优化。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站名称:引用拷贝构造赋值语句-创新互联
文章URL:http://cdkjz.cn/article/ccgojp.html