C++中的6个默认函数分别是:
1、构造函数
2、拷贝构造函数
3、析构函数
4、赋值运算符重载函数
5、取地址操作运算符的重载函数
6、带有const的取地址运算符重载函数
系统给出的函数:
1.公用的
2.内联的
对于这6个默认函数,我们分别看一下:
1、构造函数(专门用于对象的初始化)
构造函数主要做两个工作: 1.分配对象内存空间 2.调用对象的构造函数
没有实现构造函数
系统会给出默认的构造函数
自己出构造函数 系统就不会提供默认的构造函数
class CGood()
{
public:
CGood(){}
CGood(char *name=NULL,int age=0):_name(name),_age(age) {}
CGood(char *name,int age)
{
this->_name=new char[strlen(name)+1];
strcpy(_name,name);
this->_age=age;
}
private:
char* _name;
int _age;
};
2.拷贝构造函数
用一个已经存在的对象初始化相同类型新对象----------》调用的拷贝构造函数
2.1必须传引用 (防止实参和形参递归构造)
2.2系统提供的拷贝构造函数 浅拷贝(多次释放同一资源)
CGoods(const CGoods& rhs)
{
_name = new char[strlen(rhs._name) + 1];
strcpy(_name, rhs._name);
_age=rhs._age;
}
3.赋值运算符重载函数
3.1void operator=() //运算符重载
3.2用已存在的对象给另一个已存在的对象赋值
3.3系统提供的赋值运算符重载函数 浅拷贝
3.4多次释放同一资源,内存泄漏
3.5 1.防止自赋值
2.释放旧资源
3.开辟新资源进行初始化
void operator=(const CGood &rhs)
{
if(this==&rhs)
{
return;
}
delete[] _name;
_name=new char[strlen(rhs._name)+1];
_age=rhs._age;
}
4.析构函数
1、释放对象资源
2、释放对象所占空间
~CGoods()
{
cout << this << ":~CGoods()" << endl;
delete[] _name;
_name = NULL;
}
5.取地址操作运算符的重载函数
CGood *operator&()
{
return this;
}
6.带有const的取地址操作运算符的重载函数
const CGood* operator&()const
{
return this;
}
这里要清楚常对象、常成员函数、常数据成员.
常对象:类型 const 对象 / const 类型 对象
1、不允许常对象访问任何类的成员函数,一旦定义,在生存周期内不允许改变
2、const 对象定义时由构造函数初始化
3、const 对象只能访问常成员函数
常数据成员: 数据类型 const 数据成员名;
1、只能通过构造函数的初始化列表进行,不能被更新修改
常成员函数:
返回类型 成员函数名 (参数表)const;
1、const 是函数类型的一个组成部分,因此在函数实现部分也要带有const关键字
2、const成员函数不能更新对象的数据成员,也不能访问该类中没有用const 修饰的成员函数
比如: 在CGood类中有个打印函数:
void show() {}
int main()
{
CGood good1("lisi",23);
const CGood good2("zhangsan",23);
good1.show();
good2.show();//error
}
这是为什么? good1.show(); 对象调用其成员函数的时候,编译器其实是:
this=&good1;
this->show();
而this 指针的类型是 CGood *const ; good2 的类型是const CGood*;
所以要使const修饰的变量不能改变,那么都加上const
const CGood *---------------------》 const CGood * const, 所以一般打印函数我们都写成常方法就好了
void show() const