创建类
现有一个学生类Student,它的定义如下:
class Student{
private:
char *name;
int age;
float score;
};
常见的C++创建类的对象的两种方法如下:
第一种:
Student stu;
stu.name = “xiaoming”;
stu.age = 20;
stu.score = 90.0;
第二种:
Student *stu1 = new Student;
stu1->name = “Xiaoming”;
stu1->age = 20;
stu1->score = 90.0;
两种方法的区别在于第一种创建变量的方式是在栈上创建对象,而第二种方式是在堆上创建对象
在栈上创建的对象,都有自己的名字,因此直接使用该名字即可访问它,常用直接成员运算符(.)访问此类型的对象,例如:stu.name;但是在堆上创建的类的对象,没有名字,只能得到一个指向该对象的指针,所以必须使用一个指针来接收变量的指针,否则将无法访问该对象。通常情况下,在堆上创建一个对象的同时,需要使用一个指针接收,这个接收的指针称为对象指针,可以通过间接成员运算符(->)访问它的成员变量或成员函数
堆和栈
在开始讲解两者之间的区别之前,需要先讲解一下内存中堆和栈的区别
所谓内存中的堆栈并不是数据结构中的堆和栈,而是内存中的堆区和栈区,这一点是很重要的,学过数据结构的可能会将其混淆,必须明确两者是不同的概念;
程序在内存中的存储分区
程序在内存中存储示意图
总结
第一种方法是在栈上创建的对象,在程序进行编译的时候就为其分配了地址空间,无论是否使用该类,它都将占用内存空间,属于静态联编,可以使用成员运算符'.'访问其成员,不需要添加new运算符
第二种方法是在堆上创建的对象,在程序运行过程中,如果需要,则向系统申请空间,否则不申请;它属于动态联编,可以使用'->'访问其成员,需要在声明时添加new运算符