当前位置: 首页 > news >正文

网站建设必须经历的过程网站推广排名服务

网站建设必须经历的过程,网站推广排名服务,wordpress模板 知乎,一个网站的建设需要哪些流程前言#xff08;类的引入#xff09; C语言结构体中只能定义变量#xff0c;在C中#xff0c;结构体内不仅可以定义变量#xff0c;也可以定义函数。比如#xff1a; 之前在C语言中#xff0c;用C语言方式实现的栈#xff0c;结构体中只能定义变量#xff1b;现在以C方…前言类的引入 C语言结构体中只能定义变量在C中结构体内不仅可以定义变量也可以定义函数。比如 之前在C语言中用C语言方式实现的栈结构体中只能定义变量现在以C方式实现会发现struct中也可以定义函数。struct和class用法差不多当是在C中更偏向于用Class。 1.类的定义 class className { // 类体由成员函数和成员变量组成 };           class为 定义类的关键字ClassName为类的名字{}中为类的主体注意类定义结束时后面分号不能省略。         类体中内容称为类的成员类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 2.类的访问限定符 C实现封装的方式 用类将对象的属性与方法结合在一块让对象更加完善通过访问权限选 择性的将其接口提供给外部的用户使用。   2.1访问限定符的特性  1. public修饰的成员在类外可以直接被访问 2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的 3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 4. 如果后面没有访问限定符作用域就到 } 即类结束。 5. class的默认访问权限为privatestruct为public(因为struct要兼容C) 注意访问限定符只在编译时有用当数据映射到内存后没有任何访问限定符上的区别    3.类的作用域和实例化 类定义了一个新的作用域类的所有成员都在类的作用域中 。 在类体外定义成员时需要使用  :: 作用域操作符指明成员属于哪个类域。         用类类型创建对象的过程称为类的实例化 1. 类是对对象进行描述的是一个模型一样的东西限定了类有哪些成员定义出一个类并没 有分配实际的内存空间来存储它比如入学时填写的学生信息表表格就可以看成是一个 类来描述具体学生信息。 2. 一个类可以实例化出多个对象实例化出的对象 占用实际的物理空间存储类成员变量 3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图只设计出需要什么东西但是并没有实体的建筑存在同样类也只是一个设计实例化出的对象才能实际存储数据占用物理空间. 4.类对象的大小以及储存方式 类对象的储存方式只保存成员变量成员函数存放在公共的代码段 。我们打个比方类就相当于是一个小区成员变量就相当于各家各户的房间。成员函数相当于公共的游泳池健身房乒乓球桌娱乐设施。          结论一个类的大小实际就是该类中”成员变量”之和当然要注意内存对齐 注意空类的大小空类比较特殊编译器给了空类一个字节来唯一标识这个类的对象。 class A1 { public:void f1(){} private:int _a; }; // 类中仅有成员函数 class A2 { public:void f2() {} }; // 类中什么都没有---空类 class A3 {}; sizeof(A1) : ___4_ __ sizeof(A2) : ___1_ __ sizeof(A3) : ___1_ __  当然这个也要注重结构对齐对结构对齐有不了解的可以看看这篇文章 C语言结构体的内存对齐_元清加油的博客-CSDN博客 5.this指针 我们先来定义一个日期类 Date   class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout _year - _month - _day endl;} private:int _year;     // 年int _month;    // 月int _day;      // 日 }; int main() {Date d1, d2;d1.Init(2022,1,11);d2.Init(2022, 1, 12);d1.Print();d2.Print();return 0; } 对于上述类有这样的一个问题         Date类中有 Init 与 Print 两个成员函数函数体中没有关于不同对象的区分那当d1调用 Init 函 数时该函数是如何知道应该设置d1对象而不是设置d2对象呢         C中通过引入this指针解决该问题即C编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有“成员变量” 的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编 译器自动完成。 void Print(){cout _year - _month - _day endl;} 相当于下面,只不过我们可以不用写this void Print(Date*this){cout this-_year - this-_month - this-_day endl;} 5.1this指针的特性 1. this指针的类型类类型* const即成员函数中不能给this指针赋值。 2. 只能在“成员函数”的内部使用 3. this指针本质上是“成员函数”的形参当对象调用成员函数时将对象地址作为实参传递给 this形参。所以对象中不存储this指针。 4. this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传 递不需要用户传递。 6.类的6个默认成员函数 如果一个类中什么成员都没有简称为空类。 空类中真的什么都没有吗并不是任何类在什么都不写时编译器会自动生成以下6个默认成员函数。 1. 构造函数 2. 析构函数 3. 拷贝构造函数 4. 赋值运算符重载 5. const 成员函数 6. 取地址及 const 取地址操作符重载 默认成员函数用户没有显式实现编译器会生成的成员函数称为默认成员函数。 6.1构造函数 6.1.1概念 构造函数是一个特殊的成员函数名字与类名相同,创建类类型对象时由编译器自动调用以保证每个数据成员都有 一个合适的初始值并且在对象整个生命周期内只调用一次。 6.1.2特性 构造函数是特殊的成员函数需要注意的是构造函数虽然名称叫构造但是构造函数的主要任务并不是开空间创建对象而是初始化对象 。 其特征如下 1. 函数名与类名相同。 2. 无返回值。 3. 对象实例化时编译器自动调用对应的构造函数。 4. 构造函数可以重载。 5. 如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成。 6.不实现构造函数的情况下编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用d对象调用了编译器生成的默认构造函数但是d对象_year/_month/_day依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用 解答C把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类 型如int/char...自定义类型就是我们使用class/struct/union等自己定义的类型看看 下面的程序就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员 函数。 7. 无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个。 注意无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数都可以认为 是默认构造函数。 6.2析构函数 6.2.1 概念 通过前面构造函数的学习我们知道一个对象是怎么来的那一个对象又是怎么没呢的析构函数与构造函数功能相反析构函数不是完成对对象本身的销毁局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数完成对象中资源的清理工作。 6.2.2 特性 析构函数是特殊的成员函数其特征如下 1. 析构函数名是在类名前加上字符 ~。 2. 无参数无返回值类型。 3. 一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数。注意析构函数不能重载 4. 对象生命周期结束时C编译系统系统自动调用析构函数 6. 如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数比如Date类有资源申请时一定要写否则会造成资源泄漏比如Stack类。 6.3拷贝构造函数 6.3.1 概念 拷贝构造函数 只有单个形参 该形参是对本 类类型对象的引用 ( 一般常用 const 修饰 ) 在用 已存 在的类类型对象创建新对象时由编译器自动调用 。 6.3.2 特性  拷贝构造函数也是特殊的成员函数其特征如下 1. 拷贝构造函数是构造函数的一个重载形式。 2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错因为会引发无穷递归调用。 3. 若未显式定义编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝这种拷贝叫做浅拷贝或者值拷贝。 注意在编译器生成的默认拷贝构造函数中内置类型是按照字节方式直接拷贝的而自定 义类型是调用其拷贝构造函数完成拷贝的。 6.4赋值运算符重载 6.4.1运算符重载 C为了增强代码的可读性引入了运算符重载 运算符重载是具有特殊函数名数.   函数名字为关键字operator后面接需要重载的运算符符号。 函数原型返回值类型 operator操作符(参数列表) 注意 1.不能通过连接其他符号来创建新的操作符比如operator 2.重载操作符必须有一个类类型参数。 3.用于内置类型的运算符其含义不能改变例如内置的整型不 能改变其含义。 4.作为类成员函数重载时其形参看起来比操作数数目少1因为成员函数的第一个参数为隐 藏的this。 5.  .*   ::    sizeof   ?:   . 注意以上5个运算符不能重载。 6.4.2赋值运算符重载  一、赋值运算符重载格式 1.参数类型 const T 传递引用可以提高传参效率 2.返回值类型 T 返回引用可以提高返回的效率有返回值目的是为了支持连续赋值 3.检测是否自己给自己赋值 4.返回 *this 要复合连续赋值的含义         二、  赋值运算符只能重载成类的成员函数不能重载成全局函数
http://www.huolong8.cn/news/858/

相关文章: