C++ 和Java类型还是非常多的 构造写法也很类似
构造函数
#include <iostream>
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 <iostream>
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 <iostream>
#include <string.h>
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 <iostream>
#include <string.h>
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 改的是地址的值
}