1、变量和类的生命周期
变量的生存期是指变量所占据的内存空间由分配到释放的时期。变量有效的范围称为其作用域。全局变量是程序中定义在所有函数(包括main函数)之外的任何变量,其作用域
是程序从变量定义到整个程序结束的部分。这意味着全局变量可以被所有定义在全局变量之后的函数访问。全局变量及静态变量分配的空间在全局数据区,它们的生存期为整个程序的执行期间。
? 而局部变量,如在函数内或程序块内说明的变量,被分配到局部数据区,如栈区等。这种分配是临时的,一旦该函数体或程序块运行结束,所分配的空间就会被撤销。局部变量的生存期从被说明处开始,到所在程序块结束处结束。
? 对于静态变量,如果没有进行初始化,系统会自动初始化为0。局部变量如果没有进行初始化,则其值是不确定的。
? 使用new运算符创建的变量具有动态生存期。从声明处开始,直到用delete运算符释放存储空间或程序结束时,变量生存期结束。类的对象在生成时调用构造函数,在消亡时调用析构函数,在这两个函数调用之间即是对象的生存期。
2、在类中,也可以使用const关键字定义成员变量和成员函数,甚至是类的对象。由关键字const修饰的类成员变量称为类的常量成员变量。类的常量成员变量必须进行初始化,而且只能通过构造函数的成员初始化列表的方式进行。使用const修饰的函数称为常量函数。定义类的对象时如果在前面添加const关键字,则该对象称为常量对象。定义常量对象或常量成员变量的一般格式如下:
const 数据类型 常量名=表达式;
? 定义常量函数的格式如下:类型说明符 函数名(参数表)const;
? 在对象被创建以后,其常量成员变量的值就不允许被修改,只可以读取其值。对于常量对象,只能调用常量函数。总之,常量成员变量的值不能修改,常量对象中的各个属性值均不能修改。
? 不能通过常量对象调用普通成员函数 const Person person;person.getName();//错误的
当生成封闭类的对象并进行初始化时,它包含的成员对象也需要被初始化,需要调用成员对象的构造函数。在定义封闭类的构造函数时,需要添加初始化列表,指明要调用成员对象的哪个构造函数。在封闭类构造函数中添加初始化列表的格式如下:
封闭类名::构造函数名(参数表): 成员变量1(参数表),成员变量2(参数表),…{…}
初始化列表中的成员变量既可以是成员对象,也可以是基本数据类型的成员变量。对于成员对象,初始化列表的“参数表”中列出的是成员对象构造函数的参数(它指明了该成员对象如何初始化)。
先调用成员对象的构造函数,再调用封闭类对象的构造函数。
2、封闭类的复制构造函数
如果封闭类的对象是用默认复制构造函数初始化的,那么它包含的成员对象也会用复制构造函数初始化。
//成绩类 class Course{ public: int id; string name; Course(); Course(Course &course); Course(int id,string name); }; Course::Course(Course &course){ cout << "Course 复制构造函数" << endl; this->id=course.id; this->name=course.name; } Course::Course(int id,string name){ this->id=id; this->name=name; cout << "Course 普通构造函数" << endl; }; //学生类 class Student{ public: int id; string name; //学生类中包含课程(Course),Student 称为封闭类 Course course; Student(int id,string name,int cId,string cName); void show(); }; Student::Student(int id,string name,int cId,string cName):id(id),name(name),course(cId,cName){ cout << "Student 普通构造函数" << endl; } void Student::show(){ cout << "name:" << this->name <<" course:" << this->course.name<< endl; } int main(){ Student student(1,"小米",1,"数学"); student.show(); Student student2(2,"美团",1,"C++"); student2.show(); }
C++语言规定,当调用一个成员函数时,系统自动向它传递一个隐含的参数。该参数是一个指向调用该函数的对象的指针,称为this指针,从而使成员函数知道对哪个对象进行操作。
? C++规定,在非静态成员函数内部可以直接使用this关键字,this就代表指向该函数所作用的对象的指针。
? 在一般情况下,在不引起歧义时,可以省略“this->”,系统采用默认设置。
? 静态成员是类具有的属性,不是对象的特征,this表示的是隐藏的对象的指针,所以静态成员函数没有this指针。
void Person::setName(string name){ this->name=name; } string Person::getName(){ return this->name; } void Person::setId(int id){ this->id=id; } int Person::getId(){ return this->id; }
原文:https://www.cnblogs.com/jalja365/p/13029468.html