1.构造函数
用例实例化对象的时候调用的成员方法:
构造函数没有返回值,函数名与类名同名,参数没有规定(根据需要)
实例化对象的时候必须调用构造函数
一旦自己内有实现构造函数,编译器就会为我们自动默认生成一个构造函数
默认的构造函数就是没有参数的构造函数
示例如下:
class Person
{
private:
char *_name;
bool _sex;
int _age;
public:
//构造函数 函数名必须和类名同名
Person(const char *name, bool sex, int age)
{
cout << "Person(const char *name, bool sex, int age)" << endl;
_name = new char[strlen(name) + 1];
strcpy_s(_name, strlen(name) + 1, name);
_sex = sex;
_age = age;
}
Person() //系统默认自动生成没有参数的函数
{
_name = NULL;
cout << "Person()" << endl;
}
}
2.this指针
this指针:指向对象的指针
在成员方法调用的时候默认传入一个this指针
在成员方法申明/定义的地方,默认加上this指针参数
在成员方法中使用成员变量的地方加上this->
代码示例:
void eat(/*Person * const this*/) //调用的时候默认传入一个this指针
{
//this = NULL;
cout << this->_name << "::::eat" << endl;
}
3.拷贝构造函数
拷贝构造函数:
用已存在的相同类型的对象去构造新对象
如果不是自己拷贝,编译器则会自己默认生成一个拷贝构造函数
默认生成的拷贝构造函数只进行值的拷贝
代码示例如下:
Person(const Person& src) //这里必须加一个&,让系统判定为传入的参数是指针
{
cout << "Person(Person& src)" << endl;
//防止浅拷贝
_name = new char[strlen(src._name) + 1];
strcpy_s(_name, strlen(src._name) + 1, src._name);
_sex = src._sex;
_age = src._age;
}
4.等号运算符重载函数
等号运算符重载函数:
用一个已经存在的对象赋值给另一个已经存在的对象
如果自己不实现,则编译器会自己默认生成一个浅拷贝的 =
注意:防止自赋值 防止内存泄漏 防止浅拷贝
代码示例如下:
Person& operator=(const Person& src)
{
cout << "=====" << endl;
//防止自赋值
if (this == &src)
{
return *this;
}
//防止内存泄漏
if (NULL != _name)
delete[]_name;
//防止浅拷贝
_name = new char[strlen(src._name) + 1];
strcpy_s(_name, strlen(src._name) + 1, src._name);
_sex = src._sex;
_age = src._age;
return *this;
}
5.析构函数
在对象生命周期终止的时候,自动调用的成员方法
如果不自己定义析构函数,编译器就会自己生成析构函数
代码示例如下:
~Person()
{
cout << "~Person()" << endl;
delete []_name;
_name = NULL;
}
备注:class的访问属性默认为private
struct的访问属性为默认public