NDK—C++类

上一篇我们学习了C++的命名空间,这篇我们来了解一下C++的构造和析构函数

废话不多说,开始撸码

正文

构造函数、析构函数、拷贝构造函数

来个简单的例子,了解一下构造和析构的写法

class Teacher{
    public:
        int age;
    public:
        Teacher(){
            cout << "无参构造函数" << endl;
        }
        ~Teacher(){
            cout << "析构函数" << endl;
        }
    };

当类没有构造函数的时候默认会有一个无参的构造函数,构造函数的作用是初始化变量,析构函数则释放资源

既然有了构造函数,那怎么创建对象呢?

无参构造:   Teacher t;
有参构造:   Teacher t1("lypop", 21);
            Teacher t2 = Teacher("lypop", 21);
创建指针:   Teacher *tt = new Teacher("lypop",21);

对于析构函数的调用,我们将创建放在一个方法里面,当方法执行结束便会执行析构函数

class Teacher{
private:
    char *name;
    int age;
public:
    Teacher(){
        this->name = (char*)malloc(100);
        strcpy(name, "lypop");
        age = 20;
        cout << "无参构造函数" << endl;
    }
    
    //析构函数
    ~Teacher(){
        cout << "析构" << endl;
        //释放内存
        free(this->name);
    }
};

void func2(){
    Teacher t;
}

我们只需要在析构函数中释放相应的资源

除了构造函数和析构函数,类里面有个默认的拷贝构造函数,它只是一种值拷贝,当类中有指针属性的时候容易发生崩溃。所以当我们类中有指针需要在析构函数释放资源的时候,拷贝构造函数都使用深拷贝

下面来看一下值拷贝(浅拷贝)

class Teacher{
private:
    char *name;
    int age;
public:
    Teacher(char *name, int age){
        this->name = (char*)malloc(100);
        strcpy(this->name,name);
        this->age = age;
        cout << "有参构造函数" << endl;
    }   
    ~Teacher(){
        cout << "析构" << endl;
        //释放内存
        free(this->name);
    }
};

void func(){
    Teacher t1("rose", 20);

    Teacher t2 = t1;//这时候会调用默认的拷贝构造函数
}

当func执行完毕之后就会调用两次析构,因为只是简单的值拷贝,name指针指向的是同一块内存地址,当第一个被释放掉在释放第二个的时候就会出错。所以需要解决这种就需要深拷贝,也就是重写拷贝构造函数为name重新开辟一块内存地址

//深拷贝
Teacher(const Teacher &obj){
    //复制name属性
    int len = strlen(obj.name);
    this->name = (char*)malloc(len+1);
    strcpy(this->name,obj.name);
    this->age = obj.age;
}

拷贝构造函数被调用的场景:

  1. 声明时赋值
  2. 作为参数传入,实参给形参赋值
  3. 作为函数返回值返回,给变量初始化赋值
C和C++创建指针和释放资源
C  创建 int *p1 = (int*)malloc(sizeof(int) * 10);
   释放 free(p1);

C++创建 int *p2 = new int[10];
   释放 delete[] p2;//释放数组指针  delete p;//释放指针
C++访问静态属性和方法

通过类名::来访问,也可以通过类对象来访问

int Teacher::total = 9;
Teacher::total++;
Teacher::count();
常量对象、常函数

Teacher *const this;能改变指针指向的内容,不能改变指针的值

const Teacher* const this;既不能改变指针的值,又不能改变指针指向的内容

常量对象只能调用常量函数,不能调用非常量函数。常函数当前对象不能被修改,防止数据成员被非法访问

class Teacher{
    void myprint() const{
        
    }
};
void main(){
    const Teacher t1("aaa",22);

    t.myprint(); 

    system("pause");

}
友元函数、友元类

友元函数的实现,在友元函数中可以访问私有的属性

class A{
friend void modify_i(A *p, int a);
private:
    int i;
};
void modify_i(A *p, int a){
    p->i = a;
}

友元类中可以访问友元对象所在类的所有成员

class A{
friend class B;
private:
    int i;

};

class B{
public:
    //B这个友元类可以访问A类的任何成员
    void accessAny(){
        a.i = 30;
    }
private:
    A a;
};
运算符重载
  1. 类外进行运算符重载

     class Point{
     public:
         int x;
         int y;
     public:
         Point(int x = 0, int y = 0){
             this->x = x;
             this->y = y;
         }
     
         void myprint(){
             cout << x << "," << y << endl;
         }
     
     };
     
     Point operator+(Point &p1, Point &p2){
         Point tmp(p1.x+p2.x,p1.y+p2.y);
         return tmp;
     }
     
     Point operator-(Point &p1, Point &p2){
         Point tmp(p1.x - p2.x, p1.y - p2.y);
         return tmp;
     }
    
  2. 类内进行运算符重载

     class Point{
     public:
         int x;
         int y;
     public:
         Point(int x = 0, int y = 0){
             this->x = x;
             this->y = y;
         }
         //成员函数,运算符重载
         Point operator+(Point &p2){
             Point tmp(this->x + p2.x, this->y + p2.y);
             return tmp;
         }
         void myprint(){
             cout << x << "," << y << endl;
         }
         };
    
  3. 当属性私有的时候需要使用友元函数实现运算符重载

     class Point{
     friend Point operator+(Point &p1, Point &p2);
     private:
         int x;
         int y;
     public:
         Point(int x = 0, int y = 0){
             this->x = x;
             this->y = y;
         }   
         void myprint(){
             cout << x << "," << y << endl;
         }
     };
     
     Point operator+(Point &p1, Point &p2){
         Point tmp(p1.x + p2.x, p1.y + p2.y);
         return tmp;
     }
    

但是运算符重载的本质还是函数的调用,至此C++的类就总结到这里,谢谢不耐其烦的看完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • /*类和对象 1.类和实例化定义类声明类定义成员函数数据成员的赋值使用类的对象。 2.构造函数数据封装默认构造函数...
    aofeilin阅读 988评论 1 2
  • 2.1 类的基础知识2.2 构造函数2.3 拷贝构造函数2.4 析构函数2.5 C++能自动产生成员函数2...
    笑笑学生阅读 390评论 0 0
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,806评论 0 6
  • 1.面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 2.什么是类?...
    少帅yangjie阅读 4,927评论 0 14
  • //出自51博客:www.Amanda0928.51.com 第一章 一、选择题 1.B; (typedef ,t...
    Damongggggg阅读 10,897评论 0 1