美文网首页
C/C++基础(6)

C/C++基础(6)

作者: 想起个帅气的头像 | 来源:发表于2020-10-12 09:06 被阅读0次

    类的基本定义

    #include <iostream>
    
    using namespace std;
    
    class Animal {
    
    private:
        char name[64];
        int type;
    public:
        char* getName() {
            return name;
        }
        void setName(char* name) {
            strcpy(this->name, name);
        }
        void setType(int type) {
            this->type = type;
        }
        int getType() {
            return type;
        }
    };
    
    
    int main(int argc, const char * argv[]) {
        Animal dog;
        //strcpy(dog.getName(), "gougougou");
        dog.setName("gougou");
        dog.setType(1);
        cout << dog.getName() << " type: " << dog.getType() << endl;
        return 0;
    }
    

    拷贝构造函数

    class Test {
      public:
        Test(int a, int b) {
            this->a = a;
            this->b = b;
            cout << "构造函数" << endl;
        }
        //默认的拷贝构造函数是浅拷贝
        //显示的拷贝构造函数,可用来完成深拷贝
        Test(const Test &another) {
          this->a = another.a;
          this->b = another.b;
        }
      private:
      int a;
      int b;
    }
    
    void test() {
        Test t1(1, 2);
        Test t2(t1);  //调用Test的拷贝构造函数
    
        //注意,如下操作不会调用拷贝构造函数,而是会调用=操作符函数
        Test t3(3,3);
        t1 = t3;
    }
    

    构造函数和析构函数

    class Test {
      public:
        Test(int a, int b) {
            this->a = a;
            this->b = b;
            cout << "构造函数" << endl;
        }
        ~Test() {
          cout << "析构函数" << endl;
        }
      private:
      int a;
      int b;
    }
    

    析构函数最常用于内存对象的回收,回收专门在对象内部分配的额外空间。比如对象内部有char *name的属性,给name malloc了堆内存,析构用于回收name的堆空间。

    构造函数的初始化列表

    
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    class A {
    private:
        int a;
    public:
        A(int a) {
            this->a = a;
            cout << "A的int a构造方法" << endl;
        }
    };
    
    class B {
    public:
        //构造对象成员的顺序跟初始化列表的顺序无关
        //跟成员对象的定义顺序有关
        //用a1和a2对B类中的a1和a2进行赋值
        B(A &a1, A &a2, int b) : a1(a1), a2(a2){
            this->b = b;
        }
    private:
        int b;
        A a1;
        A a2;
    };
    
    int main(void) {
        //用a1,a2在b的构造函数中进行赋值
        A a1(10);
        A a2(20);
        B b(a1, a2, 100);
        
    }
    
    

    new和delete创建对象和回收内存

    //malloc free是函数,标准库, stdlib.h
    //new 在堆上初始化一个对象的时候,会触发对象的构造函数。malloc不会触发。
    //delete会触发析构函数,free不会
    void cpp() {
        int *p = new int;
        *p = 10;
        if(p!=NULL) {
            delete p;
        }
        
        //数组
        int *array_p = new int[10];
        for(int i=0;i<10;i++) {
            array_p[i] = i;
        }
        if(array_p != NULL) {
            delete [] array_p;
        }
    
        //A *a1 = new A(10);
        //A *a2 = new A(20);
        //B *b = new B(*a1, *a2, 100);
    }
    
    void c() {
        int *p = (int *)malloc(sizeof(int));
        *p = 10;
        if(p!=NULL) {
            free(p);
            p = NULL;
        }
        
        //数组
        int *array_p = (int *)malloc(sizeof(int) * 10);
        for(int i=0;i<10;i++) {
            array_p[i] = i;
        }
        if(array_p != NULL) {
            free(array_p);
            array_p = NULL;
        }
    }
    

    static成员变量

    class StaticA {
    private:
        int a;
    public:
        //static修饰静态成员变量
        static int b;
        static void addStatic() {
            b++;
        }
    };
    
    //在类的外边进行初始化,全局共享
    int StaticA::b = 10;
    StaticA::addStatic();
    
    
    1. static成员变量实现了同类对象间的全局共享
    2. static成员类外存储,类大小不包括static的变量
    3. static成员是命名空间属于类的全局变量,存储在data区
    4. static成员只能类外部初始化
    5. 可以通过类名访问,也可以通过对象访问。

    this指针

    this->内部属性
    this就是指向调用当前成员函数的对象地址

    // 类 Test
    int getA() {
      this->a = 10;  //这里可以修改this指向的属性,this指针不是const Test * this
      //this++   // this指针是一个常指针,Test * const this
      return a;
    }
    
    //如果不允许在方法内部通过this修改属性值,在函数外部增加const
    int getB() const {
      //this->a = 10;  //这里的this指针不允许被修改,当前状态为const Test * const this
      //this++   // this指针是一个常指针,Test * const this
      return a;
    }
    

    返回对象自身

    Test& get() {
        return *this;
    }
    

    友元函数

    通过指定外部函数为友元函数,来允许外部函数访问类的私有变量。
    友元单向,且不具备继承性

    class Test() {
      private:
        int a;
      public:
        int getA() {
          return a;
        } 
      //声明全局函数 a是Test类的一个友元函数。
      friend void a();
      //如果是其他类的函数,则增加类名::
      friend void A::a();
      //如果是其他类,可以声明友元类
      friend class A;
    }
    void a() {
      Test test;
      test.a = 1; //定义友元函数可以直接在类外部使用私有变量
    }
    

    操作赋重载

    这里对+号进行操作重载,使+号可以直接两个自定义类型的相加

    Test operator+(Test &t1, Test &t2) {
      // ...
    }
    int main(void) {
      Test t1;
      Test t2;
      Test t3 = t1+t2; //opreator+(t1,t2);  或t1.operator+(t2);
    }
    

    相关文章

      网友评论

          本文标题:C/C++基础(6)

          本文链接:https://www.haomeiwen.com/subject/rgdxpktx.html