C++的一大特点为面向对象的编程,封装、多态、继承为其三大特性。有关这三者的介绍会在后续逐步进行,首先记载其载体,类和对象。(涉及的内存部分将以我自己的理解展开,若内容较多,后续会重新开展专题整理。)
首先,需要构建一个最简单的类。以一个人为例。若全为public对象(关于public、protected、private会在后续讲到,此处先带着说),那么类的形成为:
#includeusing namespace std; class Person { public: string name; int age; void setName(string b) { name = b; } void setAge(int a) { age = a; } void show() { cout << "name:" << name< 作为person,此处基础信息为姓名name及年纪age,同时配以函数设置姓名、设置年纪及显示信息。在主函数可以看到,我们定义了一个类的对象,同时我们通过类的成员函数对对象设置了基本参数。
这边添加一种指针的构建办法,好处在后续记录中会体现,这边只做介绍:
int main() { Person* p= new Person; //Person ming; //Person* p = &ming; int age = 15; string name1 = "ming"; p->setName(name1); p->setAge(age); p->show(); system("pause"); }可以用指针指向新的对象,与注释处可理解为一个意思,但需注意的是,第一种方式申请的对象是在堆内存上,由程序员分配,同时需要由程序员销毁。而注释的方法则为在栈上申请,是由系统分配的,因此也由系统来销毁对象。
与正常构建对象不同,指针调用成员函数或成员变量采用"->",而不是对象用的"."。
言归正传,在构建对象及退出的过程之中实际发生了什么呢,引入了构造函数及析构函数,那为什么在代码上没有体现呢,在C++中,若没有显示定义的构造函数及析构函数,则会由编译器自动生成的构造及析构代替。因此,若想看到过程中发生了什么,或者自己做些什么,我们可以自己定义构造及析构函数。
最简单的:
#includeusing namespace std; class Person { public: string name; int age; Person() { cout << "调用构造函数" << endl; } ~Person() { cout << "调用析构函数" << endl; system("pause"); } void setName(string b) { name = b; } void setAge(int a) { age = a; } void show() { cout << "name:" << name< setName(name1); //p->setAge(age); //p->show(); //delete p; //system("pause"); return 0; } 结果为: 调用构造函数 name:ming age:15 请按任意键继续. . . 调用析构函数 请按任意键继续. . . 在定义了构造函数和析构函数后,在生成对象及退出程序,结束对象的作用域后,会调用我们写好的构造和析构函数。此处,若对象直接生成,即第一种写法在栈上申请,则在函数退出时系统会自动清理对象,则自动调用析构函数。若为在堆上申请,则需要程序员手动清理对象,即删除该对象指针后才会调用析构函数。
那么,自己定义构造函数和析构函数有什么好处呢,下篇,我将记载类的构造函数及析构函数的作用,以及多种形式的构造函数。



