class Person
{
public:
char* _name;
int _sex;
int _age;
void init(char* name, int age, int sex)
{
_sex = sex;
_age = age;
_name = new char[strlen(name) + 1];
for (int i = 0; i < strlen(name) + 1; i++)
{
_name[i] = name[i];
}
void eat()
{
cout << "eat eat eat……" << endl;
}
void sleep()
{
cout << "sleep sleep sleep ……" << endl;
}
void show()
{
cout << "name:" << _name << endl;
cout << "sex:" << _sex << endl;
cout << "age:" << _age << endl;
}
}
以上便是用class创建的一个类 , 类中有成员变量和成员函数。
this指针int main()
{
Person p1;
p1.show();
return 0;
}
我们在调用类中的函数时 ,是不用往里面写参数的 ,而这些函数也不带形参 ,那计算机是如何知道此时函数里的name,sex等是什么呢 ?
类中的函数在编译时系统会传类类型的this指针 ,用来指向这个类,而里面的参数都是被节引用的 ,我们可以在函数中直接用this指针 ,但不能改变 ,这个指针是const修饰的
void show()
{
this->eat();
cout << "name:" << this->_name << endl;
cout << "sex:" << _sex << endl;
cout << "age:" << _age << endl;
}
构造函数
构造函数是初始化类成员变量用的 ,对象构造的时候自动调用的函数 如果没有实现构造函数,编译器会自动生成一个默认构造函数---啥都不做 参数列表为空的构造函数为默认构造函数 一旦自己实现构造函数,编译器就不会自动生成了 构造函数可以重载 不能手动调用
class Person
{
public:
char* _name;
int _sex;
int _age;
Person()
{
}
Person(char* name, int age, int sex)
{
_sex = sex;
_age = age;
_name = new char[strlen(name) + 1];
for (int i = 0; i < strlen(name) + 1; i++)
{
_name[i] = name[i];
}
}
}
析构函数
对象死亡的时候自动调用的函数 如果没有实现,编译器会自动给生成一个啥都不做的空析构函数 一旦实现,编译器就不会自动生成了 析构函数没有参数,不能重载
class Person
{
~Person()
{
cout <<"~Person()" << endl;
delete[]_name;
}
}
拷贝构造
在使用同类型的已存在的对象构造对象就是拷贝构造,会自动调用 如果没有实现,编译器会自动给生成一个浅拷贝的拷贝构造函数(浅拷贝是对指针做区分的,如果类中有指针成员变量,那么浅拷贝只是把指针存放的地址拷贝过去,这样我们最后就会对这个地址删除两次,所以如果有指针成员变量,我们需要自己写一个拷贝函数) 一旦实现,编译器就不会自动生成了
class Person
{
Person(const Person& src)
{
_age = src._age;
_sex = src._sex;
//_name = src._name;
_name = new char[strlen(src._name) + 1];
for (int i = 0; i < strlen(src._name) + 1; i++)
{
_name[i] = src._name[i];
}
}
}
int main()
{
Person p1;
Person p2(p1); //拷贝构造
p2=p1 //赋值
}
这里要注意拷贝构造函数传的参数必须是引用 ,如果没有引用 ,那么就是把实参p1传给形参src 又是一个拷贝,会形成死递归。



