当对象产生时,必须初始化成员变量,当对象销毁前,必须清理对象.
初始化用构造函数,清理用析构函数,这两个函数是编译器调用.初始化的作用和析构函数的作用
构造函数点和析构函数的注意
构造函数和析构函数的权限必须是公有的
构造函数可以重载
构造函数没有返回值,不能用void,构造函数可以有参数,析构函数没有返回值,不能用void,没有参数
有对象产生必然会调用构造函数,有对象销毁必然会调用析构函数。
有多少个对象产生就会调用多少次构造函数,有多少个对象销毁就会调用多少次析构函数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Maker
{
public:
//构造函数的作用初始化成员变量 是编译器去调用的
Maker()
{
a = 10;
cout << "构造函数" << endl;
}
//析构函数,在对象销毁前编译器调用析构函数
~Maker()
{
cout << "析构函数" << endl;
}
public:
int a;
};
void test01()
{
//实例化对象,内部做了两件事
//1、分配空间
//2、调用构造函数进行初始化
Maker m;//栈区
int b = m.a;
cout << b << endl;
}
int main()
{
test01();
Maker m2;
system("pause");
return EXIT_SUCCESS;
}
这里由于system(“pause”);暂停了,还没有调用析构函数
暂停结束就调用了析构函数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Maker
{
public:
//构造函数的作用初始化成员变量 是编译器去调用的
Maker()
{
a = 10;
cout << "构造函数" << endl;
}
//析构函数,在对象销毁前编译器调用析构函数
~Maker()
{
cout << "析构函数" << endl;
}
public:
int a;
};
void test01()
{
//实例化对象,内部做了两件事
//1、分配空间
//2、调用构造函数进行初始化
Maker m;//栈区
int b = m.a;
cout << b << endl;
}
//析构函数的作用
class Maker2
{
public:
//有参构造
Maker2(const char* name,int age)
{
cout << "有参构造" << endl;
//从堆区空间申请
pName = (char *)malloc(strlen(name) + 1);
strcpy(pName, name);
mAge = age;
}
void printMaker2()
{
cout << "name:" << pName << " age:" << mAge << endl;
}
~Maker2()
{
cout << "析构函数001" << endl;
//释放堆区空间
if (pName!=NULL)
{
free(pName);
pName = NULL;
}
}
private:
char* pName;
int mAge;
};
void test02()
{
Maker2 m2("贝吉塔", 18);
m2.printMaker2();
}
int main()
{
//test01();
test02();
Maker m2;
system("pause");
return EXIT_SUCCESS;
}
构造函数和析构函数能够函数重载
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Maker
{
public:
//构造函数的作用初始化成员变量 是编译器去调用的
Maker()
{
a = 10;
cout << "构造函数" << endl;
}
//析构函数,在对象销毁前编译器调用析构函数
~Maker()
{
cout << "析构函数" << endl;
}
public:
int a;
};
void test01()
{
//实例化对象,内部做了两件事
//1、分配空间
//2、调用构造函数进行初始化
Maker m;//栈区
int b = m.a;
cout << b << endl;
}
//析构函数的作用
class Maker2
{
public:
//有参构造
Maker2(const char* name,int age)
{
cout << "有参构造" << endl;
//从堆区空间申请
pName = (char *)malloc(strlen(name) + 1);
strcpy(pName, name);
mAge = age;
}
void printMaker2()
{
cout << "name:" << pName << " age:" << mAge << endl;
}
~Maker2()
{
cout << "析构函数001" << endl;
//释放堆区空间
if (pName!=NULL)
{
free(pName);
pName = NULL;
}
}
private:
char* pName;
int mAge;
};
class Maker3
{
public://构造函数和析构函数必须是公有权限
//构造函数可以重载
Maker3()//无参构造函数
{
cout << "Maker3的无参构造" << endl;
}
Maker3(int a)//有参构造函数
{
cout << "Maker3的有参构造" << endl;
}
~Maker3()
{
cout << "析构函数" << endl;
}
};
void test02()
{
Maker2 m2("贝吉塔", 18);
m2.printMaker2();
}
void test03()
{
Maker3 m;//当构造函数私有时,实例化不了对象
//有对象产生必然会调用构造函数,有对象销毁析构函数
//有多少个对象产生就会调用多少次构造函数
//有多少个对象销毁就会调用多少次析构函数
Maker3 m2(10);
}
int main()
{
//test01();
//test02();
test03();
//Maker m2;
system("pause");
return EXIT_SUCCESS;
}
默认的构造函数和析构函数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Maker
{
public:
//Maker()//默认的构造函数,函数体是空的
//{
//}
//~Maker()//默认的析构函数,函数体是空的
//{
//}
//编译器默认提高默认的构造函数和析构函数
void printfMaker()
{
a = 100;
cout << "a=" << a << endl;
}
private:
int a;
};
void test01()
{
Maker m;
m.printfMaker();
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}