Android 音视频入门之C++入门序列(四)- 函数构造

C++ 和Java类型还是非常多的 构造写法也很类似

构造函数

#include 
using namespace std;  // C# .net也有命名空间
// 对象默认会有一个指针
class Animation {
    // 空参构造函数
    Animation() {
        cout << "空参数构造函数" << endl;
    }

    Animation(char *name) {
        cout << "一个参数构造函数" << endl;
        this->name = name;
    }

    Animation(char *name, int age) {
        cout << "二个参数构造函数" << endl;
        // 对象默认会有一个指针 指针可以用->来获取成员变量
        this->name = name;
        this->age = age;
    }
}

int main () {
    // 下面栈区开辟空间
    Animation animation; // 会调用空参构造函数
    animation.setAge(2);
    animation.setName("Cat");
    Animation animation1("Dog", 3);
}

一个参数调用二个参数构造函数写法

#include 
using namespace std;  // C# .net也有命名空间
class Animation {
    // 空参构造函数
    Animation() {
        cout << "空参数构造函数" << endl;
    }

    Animation(char *name)Animation(name,0) {
        cout << "一个参数构造函数" << endl;
        this->name = name;
    }

    Animation(char *name, int age) {
        cout << "二个参数构造函数" << endl;
        // 对象默认会有一个指针 指针可以用->来获取成员变量
        this->name = name;
        this->age = age;
    }
}
int main () {
    Animation animation("Dog1");//先会执行二个参数的构造方法,然后再执行一个参数的
    // 还有下面写法 (C工程师搞了五六年,改不了习惯就有下面写法,下面写法不会执行到构造方法里面的代码)
    Animation *ani2 = (Animation *) malloc(sizeof(Animation));
    // 系统源码中很多使用new关键字, 堆区,堆区必须手动释放 有new 就得有 delete成对出现
    Animation *ani = new Animation("Cat", 2);

    free(ani2);

    delete ani;
}

析构函数

C++里面析构函数

#include 
#include 
using namespace std; 
class Animation2 {
public:
    Animation2() {
        cout << "空参数构造函数" << endl;
    }

    Animation2(char *name) {
        // 堆区创建了 name
        this->name = (char *) (malloc(sizeof(char *) * 10));
        strcpy(this->name, name);
        cout << "一参数构造函数 name: " << name << endl;
        this->name = name;
    }

    ~Animation2() {
        cout << "析构函数  name: " << name << endl;
        // 做释放工作 name在使用了malloc申请了,所以是在堆区
        if (this->name) {
            free(this->name);
            this->name = NULL;
        }
    }

private:
    char *name;
};

// 什么时候会调用到析构函数
//1 栈区创建类 在弹栈时会调用如下面
int main () {
	Animation2 an2("Cat");
	return 0;
}
//  当上面main方法执行完时 会执行到析构函数

// 2.堆区创建后,执行了delete方法
int main () {
	Animation2 *animation2 = new Animation2("执行Delete");
	delete animation2;
	Animation2 *animation3 = new Animation2("不执行Delete");
	return0;
}
// 上面main方法 在main方法执行完了 只会执行一次析构方法,因为animation3没有执行delete

// C++中有析构函数 --
// Java中也有finalize()方法 代表这个类可能被回收, 只有GC了才会真的回收  回收的前兆
// Kotlin 需要自己重写一个Java类并实现Closeable,然后Kotlin类去继承

拷贝构造函数

struct Cat {
    int age;
    char *name;
};

int main () {
	Cat cat1 = {12, "花猫 "};
	Cat cat2 = cat1; // 寻求cat1里面的值赋值给cat2`
	// = 看起来没什么特殊,但是有隐士的代码:我们是看不到的, C/C++编译器, 会把p1的成员值赋值给p2成员
	// 但是cat1 和 cat2 二个地址不一样。
	cout << &cat1 << "----" << &cat2 << endl;  // 00FAF7BC----00FAF7AC
	
	// 结论: 对象一  = 对象二  会有一个默认的拷贝过程,成员到成员
}

自己重写拷贝构造函数

// todo 拷贝构造函数
#include 
#include 

using namespace std;

class Animation8 {
public:
    // 空参构造函数
    Animation8() {
        cout << "空参数构造函数" << endl;
    }

    Animation8(char *name) {
        cout << "一个参数构造函数" << endl;
        this->name = name;
    }

    Animation8(char *name, int age) : name(name), age(age) {
        cout << "二个参数构造函数" << endl;
    }

    // 析构函数 没有参数
    ~Animation8() {
        cout << "Animation delete 了" << endl;
    }

    // 拷贝构造函数,默认是会有,一量我们写拷贝构造函数,覆盖默认
    Animation8(const Animation8 &animation) {
        cout << "拷贝构造函数" << endl;
        // 自己控制
        this->age = animation.age;
        this->name = animation.name;
    }

private:
    char *name;
    int age;

public:
    int getAge() {
        return this->age;
    }

    char *getName() {
        return this->name;
    }

    void setAge(int age1) {
        this->age = age1;
    }

    void setName(char *name1) {
        this->name = name1;
    }
};

int main () {
	Animation8 ani1("111", 1); // 这是栈区内存
	Animation8 ani2 = ani1;  // 执行这里会调用自己重写的拷贝构造函数
	
	Animation8 ani3;
	ani3 = ani1; // 这种方式是不会调用自己重写的拷贝构造函数,但是会调用系统的,所以ani3里面也是有值。
	
	Animation8 ani4 = ani1; // 会调用拷贝构造函数
	Animation8 *animation8 = new Animation8("333", 3); // 这是堆区内存
    Animation8 *animation81 = animation8;//  这个也不会调用拷贝构造函数   因为这是指针的指向 animation81的地址指向animation8
    animation81->setAge(4); // 这时animation8的age也是4 改的是地址的值
}

你可能感兴趣的:(学习,c++)