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 又是一个拷贝,会形成死递归。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)