类与对象知识点整理(1)
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录默认成员函数一.默认构造函数二.析构函数三.拷贝构造函数四.赋值运算符五.取地址运算符总结默认成员函数一.默认构造函数作用创建对象时初始化对象内置类型不初始化自定义类型会调用其默认构造特点函数名与类名相同.⽆返回值。不需要写void.对象实例化时系统会自动调用对应的构造函数.构造函数可以重载.如果类中没有显式定义构造函数则C编译器会⾃动⽣成⼀个⽆参的默认构造函数.默认构造函数分为:无参构造函数、全缺省构造函数、编译器默认⽣成的构造函数.#includeiostream using namespace std; class Date{ private: int _year; int _month; int _day; public: //1.无参构造函数 Date() { _year1; _month2; _day3; } //2.带参构造函数 Date(int year,int month,int day) { _year year; _month month; _day day; } // 3.全缺省构造函数 Date(int year 1,int month 2, int day 3) { _year year; _month month; _day day; }注意:这三种构造函数有且只能存在一个,不然会让编译器产生歧义.二.析构函数作用对象生命周期结束时自动调用的函数用于清理资源。特点析构函数名是在类名前加上字符 ~.无返回值无参数.自定义类 型成员无论什么情况都会自动调用析构函数。有资源申请时⼀定要自己写析构否则会造成资源泄漏如Stack。⼀个局部域的多个对象C规定后定义的先析构。三.拷贝构造函数作用用一个已经存在的对象去初始化另一个新对象时调用.特点拷贝构造函数是构造函数的重载.参数必须是引用如果是传值会导致无穷递归因为传值本身要调用拷贝构造.默认的浅拷贝对于指针变量只会拷贝地址不会拷贝指向的内容.深拷贝当类中有指针成员时通常需要手动实现深拷贝否则析构时会释放同一块内存两次导致程序崩溃。四.赋值运算符作用用一个已存在的对象赋值给另一个已存在的对象时调用的函数。特点区分初始化和赋值Date d2 d1;→ 调用拷贝构造初始化d2 d1;→ 调用赋值运算符赋值必须检查自我赋值if(this other) return *this;防止释放自身资源时出错。返回值是当前对象的引用*this支持连续赋值a b c。先释放旧资源再分配新资源对于管理堆内存的类。如果类中有 const 成员或引用成员默认赋值运算符会被删除必须手动处理或避免赋值。.* :: sizeof ? : .注意以上5个运算符不能重载.重载和时需要重载为全局函数因为重载为成员函数this指针默认抢占了第⼀个形参位 置第⼀个形参位置是左侧运算对象调⽤时就变成了 对象cout不符合使⽤习惯和可读性。class String { public: String(const char* str ) { _data new char[strlen(str) 1]; strcpy(_data, str); } // 拷贝赋值深拷贝 String operator(const String other) { if (this ! other) { // 1. 自我赋值检测 delete[] _data; // 2. 释放旧资源 _data new char[strlen(other._data) 1]; // 3. 分配新资源 strcpy(_data, other._data); // 4. 拷贝数据 } return *this; // 5. 返回自身引用 } ~String() { delete[] _data; } private: char* _data; };五.取地址运算符operator作用获取对象地址时调用的运算符.两种形式ClassName* operator()// 非 const 对象取地址const ClassName* operator() const// const 对象取地址