我这更新速度着实令人担忧,毫无章法可言啊,分享一下最近在读的一本书《山月记》,是日本作家写的,看到了悟净出世这一篇,有一段是河底的妖怪都自立一派思想大家,但是那些妖怪哲学家 因为词汇的有限 只能用通俗的话语解释深刻的哲理。我想表达的是什么,或许,世间的大多数道理人人懂之,却讲不出来。无法像文化大家一样用犀利的文字直击人心,我们能做的就是多去读书,一为了弥补“讲不出”,二是能明白一些非大多数人懂得道理。
1.构造函数、析构函数
构造函数就是我们在创建类的时候,调用的函数,分两种情况,一是系统提供,二是自定义,一般我们都是自定义构造。
我们只讲一下自定义的构造函数。
构造函数的定义:
- 函数名和类名相同
- 参数可有可无,可以重载
- 无返回值
如果我们没有定义构造函数,系统会提供一个无参无函数体的函数
类名()
{
}
一旦我们自定义了构造函数,系统就不再提供
看代码
#include
#include
using namespace std;
class Stu {
private:
int age;
string name;
public:
Stu(){
}
~Stu(){
}
void printf();
};
void Stu::printf() {
cout << age << name << endl;
}
int main() {
Stu stu1;
stu1.printf();
}
这里就是我们自主定义的一个构造函数和析构函数(那就直接讲了析构吧,你想有来必有回,析构函数就是这样,格式就是在构造函数的前面加上~),这个构造里是空的,没有实体,所以这个效果就相当于如果不写系统默认提供的那个构造。
既然是函数,构造函数,构造什么东西,一般是默认的,比如上面这些代码,虽然有age和name,但是没有默认值,那我们就可以在构造函数里给它默认值。
Stu(){
age=18;
name="嘟嘟";
}
18嘟嘟
--------------------------------
Process exited after 0.02036 seconds with return value 0
请按任意键继续. . .
这些只是基本 *** 作,如果我们在构造里定义指针之类的呢,这个时候就要用到析构,在程序结束时,释放掉指针。
#include
#include
#include
using namespace std;
class Stu {
private:
int age;
string name;
int *p;
public:
Stu(){
age=18;
name="嘟嘟";
p=(int *)malloc(sizeof(int));
*p=age;
}
~Stu(){
free (p);
}
void printf();
};
void Stu::printf() {
cout << age << name << endl;
cout << *p << endl;
}
int main() {
Stu stu1;
stu1.printf();
}
18嘟嘟
18
--------------------------------
Process exited after 0.1457 seconds with return value 0
请按任意键继续. . .
还有main函数里是这种构造方式,我们说了构造函数也是函数,那是函数就可以重载,我们来看构造函数的重载。
#include
#include
#include
using namespace std;
class Stu {
private:
int age;
string name;
//int *p;
public:
Stu(){
cout << "无参构造" << endl;
age=18;
name="嘟嘟";
//p=(int *)malloc(sizeof(int));
//p=&age;
}
Stu(string _name){
cout << "有参构造1" << endl;
this->name=_name;
age=777;
}
Stu(string _name,int _age){
cout << "有参构造2" << endl;
this->name=_name;
this->age=_age;
}
~Stu(){
cout << "析构函数---";
//free (p);
cout << name << "的析构"<< endl;
}
void printf();
};
void Stu::printf() {
cout << age << name << endl;
//cout << *p << endl;
}
int main() {
Stu stu1;
stu1.printf();
Stu stu2("哈哈");
stu2.printf();
Stu stu3("嘻嘻",999);
stu3.printf();
}
(注意 注释掉了指针)
无参构造
18嘟嘟
有参构造1
777哈哈
有参构造2
999嘻嘻
析构函数---嘻嘻的析构
析构函数---哈哈的析构
析构函数---嘟嘟的析构
--------------------------------
Process exited after 0.02948 seconds with return value 0
请按任意键继续. . .
第一个对象,我们没有传参进去,所以他调用的是第一个构造函数,第二个、第三个对象传了参数,所以,它会自动匹配调用相同类型的构造函数,是不是很神奇,但是记住,析构函数只有一个。于是三个构造对应三个析构。
2.构造析构的时刻
其实从运行的结果我们可以看出来,构造肯定是在运行时建立对象的时候调用的,析构函数是在return 0,也就是程序正常结束时,而且我们看到,先构造的后析构,这是为啥呢。这就与数据结构里的栈有关系,还是那句话,构造函数也是函数,所有函数的调用都是以栈的形式实现,先进后出,所以,嗯嗯。
好,下节讲拷贝构造函数吧。。。
推荐一首歌,경고 (警告),挺有节奏感噢。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)