标签:
成员函数隐含this指针参数:
每成员函数一个隐式的指针形参(构造函数除外);
对象在调用成员函数时,编译器会将对象的地址传递给this指针;
1、构造函数(需用一个公有成员函数对私有的成员变量进行初始化,在对象构造时执行一次,无参的构造函数和带缺省值的构造函数都是缺省构造函数 ,缺省的构造函数只能有一个)
Mystring(const char *str="")//带缺省值的构造函数 { _str = new char[strlen(str) + 1]; strcpy(_str, str);
}
2、拷贝构造函数(使用同类对象来初始化;构造函数的重载;若未显示定,系统会调缺省的拷贝构造函数,缺省的拷贝构造函数会依次拷贝类成员进行初始化)
Mystring(const Mystring& s) { _str = new char[strlen(s._str) + 1]; strcpy(_str, s._str); }
Mystring s1;
拷贝构造函数的2种调用方式
Mystring s2(s1);
Mystring s3=s2;
但为什么拷贝构造函数传递的参数为引用呢?
使用传值传递会引发无穷递归调用,如上的调用方式,拷贝构造函数传入的参数为Mystring的一个实例s,由于是传值参数,所以会把形参s复制到实参s1又调用拷贝构造函数,所以会无穷的递归
3、析构函数(当一个对象的生命周期结束时,c++编译器会自动调用析构函数;负责做一些清理工作)
~Mystring() { if (_str) delete[]_str; }
4、赋值运算符的重载
Mystring& operator=(const Mystring& s) { if (this != &s) { char *tmp = new char[strlen(s._str) + 1]; delete[] _str; _str = tmp; strcpy(_str, s._str); } return *this; }
Mystring s4;
s4 = s1;
a、将返回值类型声明为该类型的引用,并在函数结束前返回实例自身的引用才能支持连续复制如(s1=s2=s3);?为什么
引用是左值(可以放在赋值运算符的左边),返回引用可以直接操作,也就可以进行连续赋值;所以s3将值复制给s2后,s2还能将值复制给s1
另外,引用作为返回值有以下几点:(使用值作为返回值会创建临时变量存储返回值,因为函数返回时局部变量会被释放必须用临时变量存储,指针也是如此,只不过临时变量里存 的时临时变量的地址。)
在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为this指向的对象;
不要返回局部对象的引用 ,当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。
b、将传入的参数申明为常量的引用,就不用调用拷贝构造函数以免不必要的消耗;
c、在分配新内存前释放自身已有的内存,以防内存泄露;
d、判断传入的参数和当前的实例(*this)是不是同一个实例,若为同一个实例时一旦释放内存,传入参数的内存也就被释放了,再也找不到需要复制的内容了。
标签:
原文地址:http://www.cnblogs.com/Blog-day/p/My_Blog_Days1-28.html