20.构造函数是在我们定义一种类型的变量时会自动被调用的函数。而且我们可以定义多个同名的构造函数--函数重载(参数不一样或者没有参数)。
#include <iostream>
using namespace std;
//构造函数:函数名和类名一样,而且没有返回函数
struct Date {
int d,m,y;
//如果没有定义任何构造函数,那么编译器会自动生成一种构造函数
Date(){
d=1; m=1; y=2000;
cout<<"default constructor!"<<endl;
}
Date(int dd){
d=dd ;m=1; y=2000;
cout<<"default constructor!"<<endl;
}
Date(int dd,int mm){
d=dd; m=mm; y=2000;
cout<<"default constructor!"<<endl;
}
Date(int dd,int mm,int yy){
d = dd;
m = mm;
y = yy;
cout<<"constructor!"<<endl; //这里不确定是否调用了函数可以进行输出一下
}
void init(){
d = dd;
m = mm;
y = yy;
cout<<"constructor!"<<endl;
}
void print() {
cout << y << "-"<< m << "-"<< d << endl;
}
int main() {
Date day;
Date day1(14);
Date day2(14,4); //会调用上面有两个参数的函数
//构造函数在定义一个类的时候会自动调用这个函数
Date day3(14,4,2000); //三个成员day.d day.m day.y传递参数
//day.print(); //通过类Date对象day调用类Date的print方法
//day.init(14,4,2000); //通过类Date对象day调用类Date的init方法
day.print(); //通过类Date对象day调用类Date的print方法
day1.print();
day2.print();
day3.print();
return 0;
}
注意:如果没有定义任何构造函数,那么编译器会自动生成一种构造函数。
21.在构造函数中剩下的内存没有释放掉,在销毁的时候需要把占用的内存释放掉就要用到析构函数。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
struct student {
char *name;
int age;
student(char *n= "no_name", int a = 15){
int len = strlen(n);
name = new char[len+1]; //name指针没有指向任何一块内存,所以需要分配一块内存
//还有结束字符,需要len+1
strcpy(name,n);
age = a;
std::cout << "constructor!" << std::endl;
}
virtual ~student() {
std::cout << "destructor!" <name << std::endl;
delete[] name; //这里把内存释放给了操作系统,否则会产生内存泄漏
}
};
void f() {
student stu1;
student stu2("wang"); //使用完要释放掉
student stu3("zhang" , 23);
std::cout << stu1.name << "\t" << stu1.age << std::endl;
std::cout << stu2.name << "\t" << stu2.age << std::endl;
std::cout << stu3.name << "\t" << stu3.age << std::endl;
//执行完要销毁,销毁的时候要调用到析构函数
}
注意1:delete[] name;是为了防止内存泄漏。
注意2:一般初始化对象的时候是在构造函数里进行,当对象销毁的时候要把内存还给操作系统。
注意3:构造函数需要提供参数,要用参数来进行构造申请资源,析构函数不需要提供参数。
|