类与对象中 深藏阁楼爱情的钟 2022-04-22 22:20 172阅读 0赞 一、类的6个默认成员函数 当类为空类时,会自动生产6个默认成员函数。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70] 二、构造函数 1.概念:构造函数是一个特殊的成员函数,名字与类名相同。在对象的生命周期内只调用一次。 2.特性 (1)函数名与类名相同 (2)无返回值 (3)对象实例化时编译器自动调用对应的构造函数 (4)构造函数可以重载 (5)若类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认函数 (6)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个 *注:构造函数并不是开空间创建对象,而是初始化对象* class Date { public: //1.无参构造函数 Date() {} //2.带参构造函数 Date(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1; //调用无参构造函数 Date d2(2019, 1, 1); //调用带参构造函数 return 0; } (7)C++把类型分成内置类型(基本类型)和自定义类型。编译器生成的默认构造函数会对自定义类型成员调用它的默认成员函数。 内置类型就是语法已经定义好的类型:如int/char…,自定义类型就是我们使用class/struct/union自己定义的类型。 class Time { public: Time() { cout << "Time()" << endl; _hour = 0; _minute = 0; _second = 0; } private: int _hour; int _minute; int _second; }; class Date { private: //基本类型(内置类型) int _year; int _month; int _day; //自定义类型 Time _t; }; int main() { Date d; return 0; } 三、析构函数 1、概念:析构函数不是完成对象的销毁,局部对象的销毁工作是由编译器完成的。对象在销毁时会自动调用析构函数,完成一些资源清理工作。 2、特性: (1)析构函数名是在类名前加上字符~。 (2)无参数无返回值。 (3)一个类有且只有一个析构函数。 (4)对象生命周期结束时,C++编译系统自动调用析构函数。 typedef int Datatype; class SeqList { public: SeqList(int capacity = 10) { _pData = (Datatype*)malloc(sizeof(Datatype)*capacity); assert(_pData); _size = 0; _capacity = capacity; } ~SeqList() { if (_pData) { free(_pData); _pData = NULL; _size = 0; _capacity = 0; } } private: int* _pData; size_t _size; size_t _capacity; }; (5)编译器生成的默认构造函数会对自定义类型成员调用其析构函数,不处理内置类型成员。 class String { public: String(const char* str = "jack") { _str = (char*)malloc(strlen(str) + 1); strcpy(_str, str); } ~String() { cout << "~String()" << endl; free(_str); } private: char* _str; }; class Person { private: String _name; int _age; }; int main() { Person p; return 0; } 四、拷贝构造 特征: (1)拷贝构造函数是构造函数的一个重载形式。 (2)拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。 class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } private: int _year; int _month; int _day; }; int main() { Date d1(2019, 1, 1); Date d2(d1); return 0; } ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70 1] 若用传值的方式,当d1传参给date时,date要将d1里的内容拷贝下来,这就又需要拷贝构造函数,继续传值后又引发了对象的拷贝,导致了无穷递归调用。而使用引用传参,date时d1的别名,d1传参给date时,不需要进行拷贝,直接使用即可。 (3)若未显示定义,系统生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或值拷贝。 class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1(2019, 1, 1); //这里d2调用的默认拷贝函数,d2的值和d1的值一样 Date d2(d1); return 0; } 五、赋值运算符重载 1、运算符重载 运算符重载是具有特殊函数名的函数。 函数名字:关键字operator后面接需要重载的运算符符号。 函数原型:返回值类型operator操作符。 注:(1)不能通过连接其他符号来创建新的操作符:比如operator@。 (2)重载操作符必须有一个类类型或联合类型的操作数。 (3)用于内置类型的操作符,其含义不能改变。 (4)作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的。 (操作符有一个默认的形参this,限定为第一个形参) (5).\* 、:: 、sizeof 、? : 、.。注意以上5个运算符不能重载。 class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } bool operator==(const Date& d) { return _year == d._year && _month == d._month && _day == d._day; } private: int _year; int _month; int _day; }; int main() { Date d1(2019, 1, 1); Date d2(2019, 2, 8); cout << (d1 == d2) << endl; return 0; } 2、赋值运算符重载 class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } Date& operator=(const Date& d) { if (this != &d) { _year = d._year; _month = d._month; _day = d._day; } return *this; } private: int _year; int _month; int _day; }; 六、const成员 1、const修饰类的成员函数 将const修饰的类成员函数称之为const成员函数,实际修饰该成员函数隐含的this指针,表明该成员函数中不能对类的任何成员进行修改。 *注:const对象不可以调用非const成员函数,而非const对象可以调用const成员函数;const成员函数内不可以调用其他的非const成员函数,而非const成员函数内可以调用其他的const成员函数* ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70 2][] 2、取地址及const取地址操作符重载 这两个默认成员函数一般不需要重新定义。 class Date { public: Date* operator&() { return this; } const Date* operator&()const { return this; } private: int _year; int _month; int _day; }; [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70]: /images/20220326/67a208f168754321a5205a823079c976.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70 1]: /images/20220326/c0395fdc51954755b80d229856fefad6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pEXzAxMg_size_16_color_FFFFFF_t_70 2]: /images/20220326/c8bc903cd83049668612583db3cd097d.png
相关 【类与对象】 `类和对象` 类是对现实生活中一类具有`共同属性`和`行为`的事物的抽象。 `类的特点` 1.类是对象的数据类型。 2.类是具有相同属性和行为的一组对象的集合 快来打我*/ 2024年03月23日 14:23/ 0 赞/ 5 阅读
相关 类与对象 类:是对某一事物的抽象描述,通过方法(成员方法)和属性(成员变量)来描述事物。 对象:对象是实际存在的该类事物的个体,因而也称实例。 创建圆类: 1 pac 傷城~/ 2023年08月17日 16:08/ 0 赞/ 74 阅读
相关 Java中的类与对象 1.类: 可以看作是一个模板或者图纸,系统根据类的定义造出对象来。我们要造汽车,怎么造?类就是图纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。 我们叫class。对象 迈不过友情╰/ 2022年11月18日 04:35/ 0 赞/ 164 阅读
相关 类与对象 类与对象 1.1 什么是类 类在生活语言中就像是种类、类别,一些事物的总称。类在Java编程 语言中属于一个较广泛的概念,而细分后,类里边还会有对象,类就是 一 傷城~/ 2022年09月25日 04:23/ 0 赞/ 169 阅读
相关 JavaScript中的类与对象 对象是对客观事物的抽象 类是对对象的抽象 JavaScript是基于对象的语言,它拥有许多创建类和对象的方法 JavaScript中允许我们在对象创建之后进行定 超、凢脫俗/ 2022年08月18日 05:48/ 0 赞/ 225 阅读
相关 类与对象 在面向对象的编程语言中,类是对对象的抽象,在类中可以定义对象的属性和方法的描述;对象是类的实例,类只有被实例化后才能被使用。 定义类 在PHP中,使用关键字cl 忘是亡心i/ 2022年07月28日 11:49/ 0 赞/ 151 阅读
相关 类与对象 Person per = new Person(); 声明对象:栈内存中声明的,与数组一样,数组数组名就保存在栈内存中,只开辟栈内存的对象是无法使用的,必须使用其堆内 超、凢脫俗/ 2022年07月12日 06:15/ 0 赞/ 175 阅读
相关 类与对象 2.1 类和对象的定义与使用 类的定义: Class 类名\{ 数据成员\-静态属性 成员函数\-动态行为 \} 对象的定义: 类名 对象名 与 int a的 逃离我推掉我的手/ 2022年05月21日 06:57/ 0 赞/ 207 阅读
相关 类与对象中 一、类的6个默认成员函数 当类为空类时,会自动生产6个默认成员函数。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_s 深藏阁楼爱情的钟/ 2022年04月22日 22:20/ 0 赞/ 173 阅读
相关 类与对象 类与对象 1.1 什么是类 类在生活语言中就像是种类、类别,一些事物的总称。类在Java编程 语言中属于一个较广泛的概念,而细分后,类里边还会有对象,类就是 一 以你之姓@/ 2022年04月12日 03:09/ 0 赞/ 231 阅读
还没有评论,来说两句吧...