C++复习2

    xiaoxiao2021-03-25  103

    C++复习2

    类class
    class A{ public: //共有的 int i; private: //私有的 int j; protected: //受保护的 int k; }
    类的成员写在外面
    1)写在类里面的方法默认是内联的 2)写在类外面的方法,加上inline修饰也可以是内联的 class A{ public: //写在外面的成员方法,要在类中声明 void fun1(int i); void fun2(int i); //写在外面的构造函数,要在类中声明 A(int i); } A::A(int i){ } void A::fun1(int i){ } inline void A::fun2(int i){ }
    封装
    通过公有的方法,访问私有的属性
    构造函数(构造器)
    1)构造函数允许重载 2)当实例化对象时,会自动使用构造器
    实例化
    在栈上实例化 类名 对象名;/类名 对象名(参数); 在堆上实例化 类名 *对象名 = new 构造器;
    析构函数(析构器)
    没有参数列表,没有返回值,在名字前面加~(名同类名) 析构器不能重载
    删除对象
    栈上对象,自动释放 堆上对象,手动释放 (delete 对象名) //class A A *p = new A(); delete p; A *pa = new A[2]{A(1,2),A(3,4)}; delete[] pa;
    私有化构造器和析构器
    1)构造器私有不能构造对象; 2)析构器私有可以创建堆上对象,不能创建栈上对象 在堆上析构对象时,无法使用delete,要用调用方法来析构。
    this关键字
    1)内置类型:int char 等基本数据类型 2)自定义类型:类 结构体 this等 3)本质: 类 * const this; 4)类中方法第一个形参,为隐藏的 “类 * const this”
    面向对象编程注意事项
    1>若没有声明,系统会默认添加 i)无参构造器 ii)复制构造器 iii)赋值运算符重载 2>一旦声明一个构造器,系统就不会再增加无参构造器 3>析构的顺序 i)栈上对象 在return 0;前,按照与实例化相反的顺序析构(因为系统是通过一个个出栈来析构) ii)堆上对象 在delete时析构
    复制构造器
    定义: 拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量 特点: 1>复制构造器可以重载 2>何时被调用 i)一个对象以值传递的方式传入函数体 ii)一个对象以值传递的方式从函数返回 iii)一个对象通过另一个对象进行初始化 全局函数: 使用复制构造器的为√反之为× 1)形参 以值传递的方式传入一个对象 √ 以传引用的方式传入一个对象 × 2)返回值 以值传递的方式从函数返回一个对象 √ 此时没有接收:会造成匿名对象 以传引用的方式从函数返回一个对象 × 此时没有接收:这个返回值是地址,若不接受,被别人利用的话很危险
    构造器、复制构造器、析构器、赋值运算符重载对比
    class Base{ public: //构造函数 Base(); //复制构造函数 Base(const Base &); //重载赋值操作符 Base &operator=(const Base &); //析构函数 ~Base(); ... private: ... };
    深复制和浅复制
    深复制(深拷贝):如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深复制(深拷贝)。 浅复制(浅拷贝):反之,没有重新分配资源,就是浅复制(浅拷贝)。 深拷贝好还是浅拷贝好? 如果实行浅拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。 这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。 这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
    友元函数
    作用:允许该函数访问私有成员 格式: class 本类名{ friend 返回值类型 函数名(...,本类名 &对象名,...); } 返回值类型 函数名(...,本类名 &对象名,...){ }
    友元类
    作用:允许该类访问私有成员 格式: class 类A{ friend 类B; } class 类B{ 返回值类型 fun(...,类A &对象名,...){ //... } }
    static关键字
    1)在C中: 1.1)局部 static修饰的局部变量,存放在全局区,其生命周期得到延长 1.2)全局 1.2.1)变量 static修饰的局部变量,只能在本文件中使用,不能被外部访问; 1.2.1)函数 static修饰的函数,只能在本文件中使用,不能被外部访问; 2)在C++中: 2.1)不能修饰类 2.2)修饰类的成员 2.2.1)修饰成员变量 i.共有的 要在全局初始化。 使用: this->该变量 对象.该变量 类::该变量 ii.私有的 要在全局初始化。 使用: 不能直接访问,需要使用静态的方法来访问 2.2.2)成员方法 静态的方法只能访问类内的静态成员、全局的变量和函数。 i.共有的 对外部提供接口,使其可以访问私有的static成员变量 ii.私有的 意义不大
    const与类
    1)const修饰类的属性(成员变量) 1.1)当const修饰类的属性(成员变量)的时候是分配空间的,也可以通过指针修改其值 例: A a(1,3); int *p = (int *)&a.i; *p = 255; 1.2)const修饰的属性可以通过参数化列表进行初始化 class A { public: const int i ; A(int a = 1,int b = 2):i(a),j(b){ //i = 0;j = 0; } private: int j ; }; /** * 因为当系统在构造对象的时候会调用参数化列表的值初始化const属性。 * 如果在构造函数的方法体内通过"="赋值运算符初始化const属性是不可以的, * 因为此时对象已经构造完成。 */ 2)const修饰成员方法 2.1)const在函数最前面时,该方法还不是const方法,只是返回值被const修饰。 2.2)const在函数最后面时,该方法是const方法,不同通过其修改对象,同时它的返回值也被const修饰了。 const方法: 1)this指针由 “类* const this” 变为 “const 类* const this”,这导致其只能访问对象里的内容,不能修改对象里的内容 2)同时const方法的返回值也为const类型,不能被修改
    const与对象
    1)const修饰的对象,叫做常对象(因为其值不可以被改变)。 1.1)特性1:const对象只能调用const方法 1.2)特性2:const对象访问共有的成员变量的时候,只能读,不能改。 2)非const对象既可以调用const方法也可以调用非const方法
    转载请注明原文地址: https://ju.6miu.com/read-23126.html

    最新回复(0)